l003 Driller Augmenting Fuzzing Through Selective Symbolic Execution_2016_NDSS学习笔记

l003 Driller Augmenting Fuzzing Through Selective Symbolic Execution_2016_NDSS学习笔记

input test cases

此部分可以加速fuzzing初始化。也可以不用。

fuzzing

driller触发时启动。探索第一区间(由特殊输入划分),直到遇到第一个复杂检查(输入变异器不适用的特殊检查),进入阻塞状态,不能再继续搜索新的路径。Driller采用的模糊器是AFL。特征如下:

  1. Genetic fuzzing遗传模糊 :使用genetic algorithm遗传演算法,遵循genetics-inspired rules遗传启发法则变异输入并用适应度函数进行分类。适应度函数以unique code coverage特殊代码覆盖率为基础,即触发没被其他路径触发过的执行路径。
  2. 状态转移追踪 将导致状态变化的输入优先作为下一代输入,也就是遗传演算法的种子。
  3. 循环分桶 发现路径包含重复时,另一种算法启动来判断该路径是否可以作为遗传演算法的种子。AFL将这些路径以循环数(1,2,4,8…)装入不同的“桶”,每个桶中的一条路径作为遗传演算法的种子。这样,每个循环只有logn的路径被作为种子,而不是n。
  4. 解随机处理 预先设置AFL的QEMU()以保证持续执行。当一个崩溃输入被发现,用concolic execution恢复“挑战应答方式”或基于leaking randomness泄露随机性的弱点。

concolic execution

模糊测试进入阻塞状态时启动。分析应用,利用模糊测试发现的特殊输入,将其变异为符合复杂检查的输入完成状态转移。将处理结果送回模糊器,控制权移交模糊器。
输入再以下两种情况之一被视作特殊:

  1. 输入导致应用采取的路径是第一个造成状态转移的路径;
  2. 输入导致应用采取的路径是第一个被放入循环桶的路径。

driller采用的是angr(一个开源的符号执行器):

  1. 首先将二进制代码翻译为Valgrind’s VEX中间代理,用符号变量代表用户输入或其他非持续输入,其他值作为具体值,符号执行运行时,给这些变量加入符号限制。
  2. 析器追踪所有内存和寄存器中的符号值和具体值,可以在任意状态点启动限制性解决方案来寻找一个可能满足所有变量限制的输入。这样的输入被递交给一般执行后能使应用到达那个状态点。
  3. driller的符号存储模型能存储具体值和符号值。它使用基于目录的存储模型,读地址可以是符号,写地址一定是具体地址。符号写地址被具体化为唯一的有效值,有些情况下,符号写地址被具体化为唯一的潜在值。这样增加了符号执行引擎的可量测性,却造成了状态空间不完整。

符号执行模块的功能:

  1. 预约束追踪:追踪模糊测试得到的特殊路径并生成新的输入。当遇到有条件的控制流转换,检查若转化条件是否会出现新的状态转移。如果会,driller生成一个输入使执行进入新的状态转移代替原始控制流。之后继续追踪匹配的路径,寻找新的状态转移。
  2. 输入预约束:输入的每个字节要匹配模糊器输出的实际字节(例:/dev/stdin[0]==’A’)。发现新的模块转移时,预约束被移除。
  3. Symbolic exploration象征性探索:探索状态转移周围的区域,找到一些基础模块,将所有路径的输入具体化。这样可以防止模糊器收到符号执行的输入后又很快进入阻塞状态。
  4. 解随机处理:找到漏洞后,追踪崩溃输入并恢复需要满足动态检查的输入字节。通过监测崩溃时刻的状态,以及找到应用输出和崩溃输入的关系,driller可以确定应用的挑战应答方式协议。

repeat

concolic鉴别出新的路径后,将这些路径递交模糊测试部分,继续变异输入,并循环,直至发现一个崩溃输入。driller的测试可以在DARPA Cyber Grand Challenge上进行。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值