AFL的安装已经在前文记录过American Fuzzy Lop(AFL)的安装与简单使用,不再赘述。这里主要记录一下在使用AFL时的可以注意的点。
下面主要记录一下利用 AFL 模糊测试 tiff (一个图像处理软件) 的过程,有源码fuzz。
$ wget https://download.osgeo.org/libtiff/tiff-4.3.0.tar.gz # 下载压缩包
$ tar -zxvf tiff-4.3.0.tar.gz
$ cd tiff-4.3.0
将编译器指定为 afl-gcc,(c++程序需要将编译器指定为afl-g++) --disable-shared 指明构建静态库,查资料显示不加这个参数构建的好像是共享库,fuzz共享库可能需要编写一个简单的demo,所以简单起见,构建静态库。
$ ./configure CC="afl-gcc" CXX="afl-g++" --disable-shared #
$ make # 然后再进行编译
$ make install
从网上找一些图片,AFL官方也给出了测试用例,我并没有采用官方的测试用例,因为后续还试用了一下AFL对测试用例的修剪功能,但官方的测试用例只有一个图片。
$ mkdir in # 该文件夹下存放种子用例
$ cd in
$ wget https://dev-www.libreoffice.org/corpus/tiffuzzer_seed_corpus.zip
$ unzip tiffuzzer_seed_corpus.zip
-i 指定输入用例目录, -o 指定结果输出的目录(会自动创建)。上一步解压出来的测试用例其实是放在 ./in/minimum-set-tif 文件夹下的,但是这里命令语句里写成 ./in 它也能读到测试用例。
$ cd ..
$ afl-fuzz -i ./in -o ./out ./tools/tiff2rgba @@ # ./tools 目录下的绿色文件都可以测试
这样直接fuzz能跑起来,但是会警告有些测试用例是没用的,建议修剪。警告如下图,所以接下来修剪一下测试用例
afl-cmin:移除执行路径相同的输入文件。 -i 输入, -o 修剪后的结果保存目录(会自动创建),修剪后input里只剩下一个文件了。
$ afl-cmin -i ./in/minimum-set-tif/ -o input -- ./tools/tiff2rgba @@
$ afl-fuzz -i ./input -o ./out ./tools/tiff2rgba @@
除了可以对多个文件整体进行修剪外,AFL还提供了对单个文件进行瘦身的功能,我们利用上一步精简后 input 目录下的一个文件来瘦身。
afl-tmin:减小单个输入文件的大小。需要注意的是 -i 后面跟的不能是目录,必须是文件,相应地,-o 输出出来的也是一个文件。
$ afl-tmin -i ./input/rhbz135888-1.tiff -o input_testcase -- ./tools/tiff2rgba @@
Honggfuzz 的原理和使用整体上跟AFL很像,就不细说了。
$ wget https://download.osgeo.org/libtiff/tiff-4.3.0.tar.gz # 下载压缩包
$ tar -zxvf tiff-4.3.0.tar.gz # 解压
$ cd tiff-4.3.0
$ ./configure CC="hfuzz-gcc" CXX="hfuzz-g++" # 将编译器指定为 hfuzz-gcc,(c++程序需要将编译器指定为hfuzz-g++)
$ make # 然后再进行编译
$ make install
$ mkdir in # 该文件夹下存放种子用例
$ cd in
$ wget ...... # 从网上获取一些用例
$ cd ..
$ honggfuzz -s -f in -W out --./tools/tiff2rgba # -f 指定输入用例, -W 制定结果输出的文件(会自动创建)。
由于我只是想试用一下这两个模糊测试工具,并不是冲着发现漏洞去的,所以跑一会儿就手动(Ctrl+c)停止了。这两款工具好像并不会自动停止fuzz,所以何时手动终止测试也是一门学问,有时间再记录。
Fuzz其中有很多原理和机制也还没弄明白,欢迎指正和讨论。
参考文章,感谢大佬们:
https://foxglovesecurity.com/2016/03/15/fuzzing-workflows-a-fuzz-job-from-start-to-finish/
https://www.freebuf.com/articles/system/191543.html