0x00 原理
环境:kail linux
选取AFL对libtiff(Libtiff 是一个用来读写标签图像文件格式的库)进行模糊测试,作为入门示例。——测试目标libtiff。
将libtiff的编译程序指定为AFL的编译器(afl-gcc,afl-g++)进行编译,这样AFL编译器会对源码进行打桩。 最后通过afl-fuzz 启动编译出来的libtiff程序,并指定输入文件夹与输出文件夹。 AFL会读取输入文件,进行变异喂给应用程序,最后将crash等输出信息保存到输出文件夹。
打桩原理:
源码:
while (go):
req = get_request()
process(req)
AFL插入后代码:
while (go)
put_request(read(file)) // AFL
req = get_request()
process(req)
notify_fuzzer() // AFL
0x01 AFL安装
下载:wget http://lcamtuf.coredump.cx/afl.tgz tar xfz afl.tgz
解压:tar xfz afl.tgz
进入文件夹:cd afl-1.88b (看下载的版本,不一定是1.88)
安装: sudo make install
0x02 编译libtiff
下载:wget http://download.osgeo.org/libtiff/tiff-3.8.2.tar.gz
解压:tar zxvf tiff-3.8.2.tar.gz
加入文件夹: cd tiff-3.8.2
指定编译程序为AFL的编译器:export CC=afl-gcc (设置linux环境变量,env查看)
export CXX=afl-g++
编译:./configure –disable-shared
make clean
make
编译完成后会在tools文件夹下面生成可执行程序如bmp2tiff
0x03 开始fuzzing
建立输入输出文件夹:mkdir input output
将初始文件放入到输入文件夹中: cp bmp/full/images/* input/
(也可在网上下载,关键在于把初始文件放入到input文件夹)
开始fuzzing: afl-fuzz -i input –o output /root/tiff-3.8.2/tools/bmp2tiff @@ /dev/null(通过afl-fuzz启动应用程序,-i指定应用程序的输入,-o指定fuzzing结果的输出,/root/tiff-3.8.2/tools/bmp2tiff通过AFL编译生成的应用程序路径,/dev/null不输出错误信息到屏幕中)
开发fuzzing后会进入这样一个界面
Output中生成这些文件,一些crashes和hangs文件等
0x04 小结
AFL非常适合于linux下有源码程序的测试,在linux下环境搭建简单,使用方便。对于crash的分析与对无源码程序的fuzz有待后续深入研究。
0x05 参考资料
http://files.meetup.com/17933012/2015-03-introduction-fuzzing-with-afl.pdf
http://lcamtuf.coredump.cx/afl/README.txt
http://lcamtuf.coredump.cx/afl/