使用Afl-fuzz (American Fuzzy Lop) 进行fuzzing测试(二)——详细使用说明(README.txt)

  • Post author:
  • Post category:其他


不完全译自:

http://lcamtuf.coredump.cx/afl/README.txt


转载请注明出处。

随手翻译的笔记,还有待继续整理。

AFL算法

1) 把用户提供的初始测试用例加载到队列(queue)中;

2) 从队列中获取下一个测试输入文件;

3) 在保持程序行为的前提下,尝试修剪(trim)测试用例(体积)到最小;

4) 使用传统的模糊测试策略中的各种已有的研究方法,重复变异文件;

5) 如果生成的变异结果能够驱动新的状态转换(通过插桩记录),则把这一测试用例加入到队列中;

6) 调到第2步。

已经发现的测试用例也会周期性地被新的、能驱动更高代码覆盖率的测试用例替代,或者使用若干其他插桩层驱动的最小化的措施删除。

作为模糊测试步骤的副作用(side effect),工具生成比较小的,自足的测试用例语料。这些是非常有用的。

因为以上的措施,使得AFL能比盲fuzz或者只有代码覆盖率驱动的工具具有更好地性能。

使用AFL对程序插桩

在有被测试程序源码的前提下,可以直接使用AFL替代gcc或者clang作为编译器,AFL的插桩具有非常低的性能影响。加上其他的afl-fuzz性能优化措施,大部分程序能被快速fuzzed,甚至会比传统的工具更快。

重新编译目标程序的配置可能会因不同程序而不同,但通用的步骤是:

$ CC=/path/to/afl/afl-gcc ./configure
$ make clean all

对C++程序,设置为CXX=/path/to/afl/afl-g++

对clang编译的程序,可以用同样的方式设置,如afl-clang和afl-clang++。clang用户同样可以选择利用llvm_mode/README.llvm提到的高性能的插桩模式。

当测试lib库的时候,需要找到或者写入简单程序,从stdin或者从文件读取数据,传入到被测试的lib库中。所以,以把被插桩的lib库以静态的方式连接到可执行文件显得至关重要。或者确保正确的.so文件在程序运行时加载(通过LD_LIBRARY_PATH)。最简单的选择是使用静态编译,通常采用以下方式:

$ 



版权声明:本文为youkawa原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。