zoukankan      html  css  js  c++  java
  • AFL使用策略说明

    Walking byte flips:

    这一方法的自然扩展是步行位翻转方法,该方法依赖于8、16或32位的宽位翻转,并使用一个字节的常量stepover。这一策略在每百万次输入中发现了大约30条额外路径,而在更短的比特翻转的情况下可能会触发这一策略。很明显,每个传递都需要一个输入文件的一个execve()调用,这使它非常便宜,但是也限制了它的潜在收益。

    Simple arithmetics:

    为了在确定的方式中触发更复杂的条件,afl使用的第三个阶段试图在输入文件中巧妙地增加或减少现有的整数值;这是用一个字节的stepover完成的。实验选择的范围是-35到+35;越过这些界限,收益率急剧下降。特别地,对于每一个字节(在-128到+127的范围内的算术运算)顺序尝试每个值的流行选项帮助非常小,并且被afl跳过。

    当涉及到实现时,阶段由三个独立的操作组成。首先,模糊尝试在单个字节上执行减法和加法。在此过程中,第二步涉及到16位的值,使用两个字节,但是如果操作也会影响到最重要的字节(否则,操作将简单地复制8位传递的结果),就会对它们进行递增或减重。最后一个阶段遵循相同的逻辑,但是对于32位的整数。这种方法的收益取决于格式的不同,从每百万的JPEG到xz的每百万次增加到8个。成本相对较高,平均每个字节的输入文件平均约20个字节(),但是可以显著地提高,只要坚持+/-16,对路径覆盖的影响就会很小。

    Known integers:

    afl所采用的最后一种确定方法依赖于一组硬编码的整数集,因为它们明显提高了典型代码中触发边界条件的可能性(例如,-1、256、1024、maxint-1、maxint)。这个模糊器使用一个字节的stepover来顺序覆盖输入文件中的现有数据,其中一个大约有24个“有趣”的值,使用两个字节(写操作是8-16-32位宽)。这个阶段的产量在每百万次尝试中增加2到5条路径;平均成本大约是每字节输入文件的30个execve()调用。

    Stacked tweaks:

    对于特定的输入文件来说,确定性策略已经用尽了,这种模糊的方法将继续循环的随机操作,包括一个堆叠的序列:一位翻转,试图设置“有趣”的字节,单词,或dword(都是小端的),将小整数加或减为字节、单词或dword(都是小端的),完全随机的单字节集,块删除,通过覆盖或插入来阻止重复,块memset。基于相当数量的测试,当每个操作的概率大致相同时,最佳执行路径的收益率似乎达到了最佳执行路径;栈操作的数量被选为1到64之间的两个power2;块大小的块大小限制在1kB左右。这个阶段的绝对收益通常比前面所有确定阶段所发现的执行路径的总数量具有可比性或更高。

    Test case splicing:

    这是一种最后的策略,它需要从至少两个位置不同的队列中获取两个不同的输入文件;然后在中间的一个随机位置将它们拼接在一起,然后通过“堆叠调整”算法的短期运行来发送这个临时输入文件。这种策略通常会发现大约20%的额外执行路径,这些执行路径不太可能在以前的操作中触发。(当然,这种方法需要一个好的、多种多样的输入文件;afl自动生成一个,但是对于其他工具,您可能需要手工构建它。)如您所见,确定性块操作(复制、拼接)并不是以一种详尽的方式进行的;这是因为它们通常需要二次时间(或者更糟)——因此,虽然它们的收益率可能有利于非常短的输入,但它们的降解速度非常快。

    预处理工具介绍

    afl-analysis:

    该工具接受一个输入文件,在这个数据流中依次翻转字节,然后在每次翻转之后观察目标二进制文件的行为。从这些信息可以推断出几件事情: 
    1.Classify some content as no-op blocks that do not elicit any changes to control flow (say, comments, pixel data, etc).将某些内容分类为无操作块,这些块不会引发任何对控制流的更改(比如:评论,像素数据等等) 
    2. Checksums, magic values, and other short, atomically compared tokens where any bit flip causes the same change to program execution.校验和,魔法值和其他简短的原子比较,其中任何位翻转都会导致程序执行相同的变化。 
    3. Longer blobs exhibiting this property - almost certainly corresponding to checksummed or encrypted data.更长的blob显示此属性 - 几乎肯定对应于校验和或加密的数据。 
    4. “Pure” data sections, where analyzer-injected changes consistently elicit differing changes to control flow.“纯粹的”数据部分,其中分析器注入的变化始终引起控制流程的不同变化。

    afl-tmin:

    独立工具,能够自动收缩测试用例,同时仍然确保它们在目标二进制文件中执行相同的功能(或者触发相同的崩溃)。另一个类似的工具afl-cmin采用了类似的技巧来消除任何大型测试语料库中的冗余文件。

    afl-cmin:

    获取一个潜在的测试用例文件夹,然后运行每个测试用例,并将它收到的反馈与所有测试用例进行比较,以找到最有效地表达最独特的代码路径的最佳测试用例。最好的测试用例被保存到一个新的目录中。

    两个工具大的区别是tmin会修改输入的文件而cmin只是在现有的文件中找到最小的消耗最小的文件。

    AFL有两种类型的模糊策略,一种是确定性的,一种是随机和混乱的。在启动afl-fuzz实例时,您可以指定您想要哪个类型的策略。一般来说,您只需要一个确定性(或master)模糊器,但是您可以拥有像您的盒子所能处理的任意数量的随机(或从属)的模糊。如果您以前使用过AFL,不知道这是什么意思,那么您可能只运行过一个AFL-fuzz的实例。如果没有指定模糊的策略,那么afl-fuzz实例将在每个策略之间来回切换。还要注意在每个命令中使用的参数-M和-S。通过传递-M模糊-模糊,我告诉它是一个主模糊(使用确定性策略),而模糊实例的名称是模糊的。另一方面,传递给第二个命令的-S模糊表示以一个随机的、混乱的策略运行该实例,并带有模糊的名称。当发现新的代码路径时,这两种模糊的代码将相互作用,将新的测试用例来回传递给彼此。

  • 相关阅读:
    javaweb登录验证码的实现
    jQuery Ajax 简单的实现跨域请求
    Java Socket长连接示例代码
    Java socket长连接代码实现
    带日期的bean转为json(bean->JSON)
    函数迭代器、生成器、递归
    闭包函数和装饰器
    函数名称空间与作用域
    函数基础
    基本的文件操作
  • 原文地址:https://www.cnblogs.com/0xHack/p/9413305.html
Copyright © 2011-2022 走看看