天天看点

AFL使用

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/