AFL-FUZZ使用笔记(1)

一,AFL简介

AFL(American Fuzzy Lop)是一款基于覆盖引导(Coverage-guided)的模糊测试工具,它通过记录输入样本的代码覆盖率,从而调整输入样本以提高覆盖率,增加发现漏洞的概率。

①从源码编译程序时进行插桩,以记录代码覆盖率(Code Coverage);
②选择一些输入文件,作为初始测试集加入输入队列(queue);
③将队列中的文件按一定的策略进行“突变”;
④如果经过变异文件更新了覆盖范围,则将其保留添加到队列中;
⑤上述过程会一直循环进行,期间触发了crash的文件会被记录下来。

AFL-FUZZ使用笔记(1)_第1张图片

 

开始Fuzzing前,首先要选择一个目标。 AFL的目标通常是接受外部输入的程序或库,输入一般来自文件。

AFL主要用于C/C++程序的测试,所以这是我们寻找软件的最优先规则。

2,AFL安装

从官网http://lcamtuf.coredump.cx/afl/ 下载最新版的源码(latest version),解压后进入所在目录。执行以下命令进行编译和安装:

make
sudo make install

输入afl-fuzz测试安装是否成功;

AFL-FUZZ使用笔记(1)_第2张图片

查看AFL安装目录:

AFL-FUZZ使用笔记(1)_第3张图片

通过查阅资料我们大概知道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 用于对单个用例进行执行路径跟踪

3,AFL使用

按照https://xz.aliyun.com/t/4314 的思路,我们也拿一个c语言程序来进行试用AFL-FUZZ;

AFL-FUZZ使用笔记(1)_第4张图片

将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 @@

会出现两次报错

AFL-FUZZ使用笔记(1)_第5张图片

需要根据提示设置一波core_pattern

sudo su

echo core >/proc/sys/kernel/core_patter
  • AFL-FUZZ使用笔记(1)_第6张图片

    按照要求

cd sys/devices/system/cpu

echo preformance | tee cpu*/cpufreq/scaling_governor

之后进入fuzz执行界面,在last new path列报错 (odd,check syntax!),通常意味着命令行实际上没有读取文件。

AFL-FUZZ使用笔记(1)_第7张图片

 

改用-f参数如下,并正常进入FUZZ

afl-fuzz -i afl-test/in -o afl-test/out1 -M fuzzer11  ./afl-demo1 -f

AFL-FUZZ使用笔记(1)_第8张图片

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的数量

4,Crash分析

进入指定的out目录下,crashes存放了fuzz过程中导致项目崩溃的情况的文件(有待研究)

AFL-FUZZ使用笔记(1)_第9张图片

对out目录分析还有待研究。。以后可能更新或写到下一篇笔记中。

 

参考文章:

https://www.cnblogs.com/tomyyyyy/articles/13610206.html

https://xz.aliyun.com/t/4314

https://paper.seebug.org/841/

你可能感兴趣的:(笔记,模糊测试)