关于AFL fuzzlinux
AFL fuzz是一个模糊测试工具,它封装了一个GCC/CLang编译器,用于对被测代码从新编译的过程当中进行插桩。插桩完毕后,AFL fuzz就能够给其编译过的代码输入不一样的参数参数,跟踪被测代码的执行路径,并断定对输入的变异可否触发新的已知或未知执行路径。工具
某些状况下,你可能不想从新编译被测代码,或者根本没有被测程序的源代码,所以没法用编译的方式插桩。针对这种状况,AFL fuzz提供了QEMU模式,QEMU即“user emulation”的缩写,至关因而黑盒测试,主要用于压力测试(被测系统性能将降低2~5倍,但相好比DynamoRIO、PIN这些工具,QEMU的性能还算不算了)。性能
安装测试
AFL fuzz的安装很是简单,只须要去官网下载最新版本的源代码,解压缩后依次执行下面的指令:ui
make blog
sudo make install内存
若须要使用QEMU模式,参见下面的步骤:资源
一、使用./build_qemu_support.sh 脚本进行构建,其会自动下载、配置并编译QEMU的二进制代码,此过程比较耗时,且这一过程当中须要解决一些依赖包的问题(必须的依赖包:libtool、glib2-devel)。input
二、编译完成后,在afl-fuzz的启动参数中加入“-Q”便可启用QEMU模式。编译器
注意:
一、QEMU模式须要较大内存空间,建议的最低配置为200M,负责项目则须要更多。当在afl-fuzz的启动参数中指定的-Q参数时,afl-fuzz会自动设置-m参数,默认值为200M。
二、afl-fuzz适用于linux系统,且不追踪共享库,即:
2-一、对于想要分析的库必须以静态方式连接到可执行二进制文件;
2-二、对于C的标准库及其余一些比较耗费资源而又没必要要测试的库则必须以动态方式连接,不然afl fuzz是没有办法不测这些内容的。
示例
已对binutils的模糊测试为例,说明如何使用afl fuzz。
首先,须要下载binutils的源码并解压,进入加压后的文件夹,重写CC编译环境变量的值(若是是C++程序,且用g++而不是gcc进行编译,则修改CXX),修改后便可运行configure脚本,而后编译。
cd ~/binutils-2.25
CC=afl-gcc ./configure
make
注:若是用clang,而不是gcc,则将CC改成afl-clang。
编译完成后,要修改一下配置,使系统将coredump输出到文件,而不是上报给系统的处理程序:
# echo core > /proc/sys/kernel/core_pattern
建一个input文件夹做为afl fuzz的输入,afl fuzz将在这个输入的基础上进行变异,在创建一个out文件夹,做为afl fuzz的输出,afl fuzz会将崩溃、挂起等问题记录到输出文件中:
cd ~/binutils-2.25
mkdir afl_in afl_out
cp /bin/ps afl_in/
接下来,就可使用afl fuzz进行模糊测试了:
cd ~/binutils-2.25
afl-fuzz -i afl_in -o afl_out ./binutils/readelf -a @@
afl fuzz启动后,咱们将看到以下界面: