AFL- American Fuzzy Lop
Intro
AFL主要的三个组成:
编译器wrapper
编译软件,linux下的C/C++编译工具gcc/g++,afl的编译工具为afl-gcc/afl-g++,afl-clang等。
测试器 fuzzer:afl-fuzz
AFL的主体,用以对软件进行fuzzing。
辅助工具
如afl-cmin,afl-tmin等,这些工具都是为提升测试的效率和成功率而服务的。
Install
64位Ubuntu 18.04下,下载依赖:
sudo apt install clang llvm
下载最新安装包(2.52b):
wget http://lcamtuf.coredump.cx/afl/releases/afl-2.52b.tgz
解压编译,安装:
tar -zxvf afl-2.52b.tgz
cd afl-2.52b
make
sudo make install
Using
工作流程
afl-gcc编译工程代码,
以文件(尽量 <1K)为输入,
启动afl-fuzz程序,将testcase(seed) 喂给程序代码,
程序接收此次输入执行程序,如果发现新的路径则保存此testcase到一个queue中,afl-fuzz继续编译testcase,因此程序每次接收不同的输入,如果程序崩溃,则记录crash。
Make
afl-gcc -g -o test test.c
Test
生成文件夹fuzz_in,fuzz_out
初始化testcase
mkdir fuzz_in fuzz_out
echo xxx > fuzz_in/testcase
fuzzing
afl-fuzz -i fuzz_in -o fuzz_out ./test @@
启动afl-fuzz中往往会报错,表示某些环境变量没有配置或者配置错误;根据提示,修改或配置afl-fuzz options以及系统环境变量即可
crash
fuzz_out/crashes/
目录下,
将crash文件用作输入可以使程序崩溃, ./test fuzz_out/crashes/id:000002,sig:06,src:000002,op:havoc,rep:8
然后gdb调试即可.
查看使程序崩溃的输入文件:
xxd id:000002,sig:06,src:000002,op:havoc,rep:8
AFL Interface Intro
process timing
block
run time:fuzzer的运行时间
last new path:最近一次发现新执行路径的时间
last uniq crash:最近一次崩溃的时间
last uniq hang:最近一次超时的时间
overall results
block
cycles done:运行的总周期数
total paths:总路径数
uniq crashes:崩溃次数
uniq hangs:超时次数
state progress
block
now trying:正在测试的fuzzing策略
stage execs:进度
total execs:目标的执行总次数
exec speed:目标的执行速度
如果执行速度小于500/sec,测试时间会非常漫长,需要优化fuzzing。详见官网
参考
兄弟工具ConAFL