简单的活着

AFL

Posted on By Mista Cai

AFL- American Fuzzy Lop

Afl-fuzz白皮书

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


AFL的官网

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

AFL_Fuzz的简单安装与编译

Finding bugs using AFL