AFL(American Fuzzy Lop)变异策略

参考:http://lcamtuf.blogspot.com/2014/08/binary-fuzzing-strategies-what-works.html

变异策略决定了fuzzers的生存与死亡。如果对输入文件的变异过于保守,则fuzzer的代码覆盖率有限。如果过于激烈,则大多数测试用例可能无法解析,浪费CPU时间。

下面来看一下具体的变异策略:

  • 位翻转:AFL采用的第一个也是最基本的变异策略是顺序执行的有序位翻转。在一行中翻转的位数从1到4。在一个庞大而多样化的输入语料库中,得出了以下结论:

    翻转一个位:生成的每百万个输入中有70条新路径。

    翻转两个位:生成的每百万个输入中增加20条新路径。

    翻转四个位:生成的每百万个输入中增加10条新路径

    (增加的路径是在上一个策略中没有发现的路径)

    当然,这个策略的花费相对较高,输入文件中每个字节的传递都需要8 个execve()。随着回报快速减少,AFL会在这三次通过以后停止,并切换到第二个比较便宜的策略。

  • 字节翻转:字节翻转是位翻转的扩展。这个方法主要是8,16,32位的宽字节翻转。除了可以用较短的翻转触发的情况之外,这一策略生成的每百万次输入中增加约30条路径。

    非常明显的是,输入文件每一个字节的传递只需要一个execve(),因此它的花费较少。但这也限制了绝对条件下它的潜在效率。

  • 简单算术:为了以确定性的方式去触发更复杂的条件,在第三个阶段,AFL尝试在输入文件中轻微的增加或减少现有的整数值。实验选择的操作范围为-35到+35,通过这个范围,fuzzing区域大幅减少。

    这个策略包含3个步骤:首先,fuzzer尝试对每个字节进行加法与减法操作。第二步是对16位进行递增或递减操作,但只有当这个操作会影响到最高有效字节时才会进行(否则,就会重复第一步)。第三步操作与第二步类似,是对32位进行操作。

    这个策略的效果根据格式的不同而有所不同:从JPEG的每百万个增加2条新路径到xz的每百万个增加8条新路径。花费也相对较高,输入文件中每个字节的传递大约需要20个execve()。

  • 已知整数:AFL采用的最后一个确定性方法依赖于一些可触发边缘条件的整数集(例如,-1,25,1024,MAX_INT-1,MAX_INT)。fuzzer使用端点值逐步对输入文件中的现有数据进行覆盖。

    这个策略每百万个增加2到5条新路径输入文件中每个字节的传递大约需要30个execve()。

  • 堆调整:确定性策略耗尽以后,fuzzer会继续执行一个无休止的随机循环操作,该循环由以下堆序列组成:

    单个位翻转,
    尝试设置“有趣”的字节,单词或双字(两个内部),(边缘值)
    将小整数加到或减去字节,单词或双字(两个末尾),
    完全随机的单字节集,
    块删除,
    通过覆盖或插入来阻止重复,
    memset()函数操作。(memset作用是在一段内存块中填充某个给定的值)

    基于大量的测试,当每个操作执行的概率大致相同时,效果似乎最好。堆叠操作的数量被选为1到64之间的二分之一; 并且块操作的块大小限制在大约1 kB。

    基于相当多的测试,当每个操作的概率大致相同时,似乎实现了最优的执行路径收益; 堆操作的数量是1到64之间的二分之一; 并且块操作的块大小限制在大约1 kB。

    这一阶段的所发现的路径多于之前确定性策略的路径和。

  • 测试集拼接:这是一个最后的策略,涉及从至少两个位置不同的队列中获取两个不同的输入文件; 并在中间的随机位置拼接它们,然后进行短时间的“堆调整”策略。 这个策略通常会发现之前策略中没有触发的执行路径中的20%。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值