AFL(American Fuzzy Lop)是一款基于覆盖引导(Coverage-guided)的模糊测试工具,它通过记录输入样本的代码覆盖率,从而调整输入样本以提高覆盖率,增加发现漏洞的概率。
①从源码编译程序时进行插桩,以记录代码覆盖率(Code Coverage);
②选择一些输入文件,作为初始测试集加入输入队列(queue);
③将队列中的文件按一定的策略进行“突变”;
④如果经过变异文件更新了覆盖范围,则将其保留添加到队列中;
⑤上述过程会一直循环进行,期间触发了crash的文件会被记录下来。
开始Fuzzing前,首先要选择一个目标。 AFL的目标通常是接受外部输入的程序或库,输入一般来自文件。
AFL主要用于C/C++程序的测试,所以这是我们寻找软件的最优先规则。
从官网http://lcamtuf.coredump.cx/afl/ 下载最新版的源码(latest version),解压后进入所在目录。执行以下命令进行编译和安装:
make
sudo make install
输入afl-fuzz测试安装是否成功;
查看AFL安装目录:
通过查阅资料我们大概知道AFL下一些文件的作用:
• afl-gcc 和afl-g++ 分别对应的是gcc 和g++ 的封装
• afl-clang 和afl-clang++ 分别对应clang 的c 和c++ 编译器封装À。
• afl-fuzz 是AFL 的主体,用于对目标程序进行fuzz。
• afl-analyze 可以对用例进行分析,通过分析给定的用例,看能否发现用例中有意义的字段。
• afl-qemu-trace 用于qemu-mode,默认不安装,需要手工执行qemu-mode 的编译脚本进行编译,后面会介绍。
• afl-plot 生成测试任务的状态图
• afl-tmin 和afl-cmin 对用例进行简化
• afl-whatsup 用于查看fuzz 任务的状态
• afl-gotcpu 用于查看当前CPU 状态
• afl-showmap 用于对单个用例进行执行路径跟踪
按照https://xz.aliyun.com/t/4314 的思路,我们也拿一个c语言程序来进行试用AFL-FUZZ;
将CC和CXX加入环境变量(makefile文件中的参数,测试有makefile文件的项目时必须这样作,此处不必要)
export CC=afl-clang;export CXX=afl-clang++;
插桩编译目标
afl-gcc -g -o afl-demo1.c afl-demo1
开始fuzz
对那些可以直接从stdin读取输入的目标程序来说,语法如下:
$ ./afl-fuzz -i testcase_dir -o findings_dir /path/to/program […params…]
对从文件读取输入的目标程序来说,要用“@@”,语法如下:
$ ./afl-fuzz -i testcase_dir -o findings_dir /path/to/program @@
我们这里使用第二种
afl-fuzz -i afl-test/in -o afl-test/out1 -M fuzzer11 -- ./afl-demo1 @@
会出现两次报错
需要根据提示设置一波core_pattern
sudo su
echo core >/proc/sys/kernel/core_patter
cd sys/devices/system/cpu
echo preformance | tee cpu*/cpufreq/scaling_governor
之后进入fuzz执行界面,在last new path列报错 (odd,check syntax!),通常意味着命令行实际上没有读取文件。
改用-f参数如下,并正常进入FUZZ
afl-fuzz -i afl-test/in -o afl-test/out1 -M fuzzer11 ./afl-demo1 -f
PS: 常见参数的含义如下
-f参数表示:testcase的内容会作为afl_test的stdin
-m参数表示分配的内存空间
-i 指定测试样本的路径
-o 指定输出结果的路径
/dev/null 使错误信息不输出到屏幕
-t:设置程序运行超时值,单位为 ms
-M:运行主(Master) Fuzzer
-S:运行从属(Slave) Fuzzer
从界面上主要注意以下几点:
last new path 如果报错那么要及时修正命令行参数,不然继续fuzz也是徒劳(因为路径是不会改变的);
cycles done 如果变绿就说明后面及时继续fuzz,出现crash的几率也很低了,可以选择在这个时候停止
uniq crashes 代表的是crash的数量
进入指定的out目录下,crashes存放了fuzz过程中导致项目崩溃的情况的文件(有待研究)
对out目录分析还有待研究。。以后可能更新或写到下一篇笔记中。
参考文章:
https://www.cnblogs.com/tomyyyyy/articles/13610206.html
https://xz.aliyun.com/t/4314
https://paper.seebug.org/841/