使用afl-fuzz测试poppler(二)
上节内容:使用afl-fuzz测试poppler(一)
开始fuzz
- 在fuzz之前,先看下
\alf-2.52b\testcases
文件夹,这里面存放的就是最初用来作为输入的样本
-
poppler一款pdf处理工具,所以,我们将
\testcases\others\pdf
文件夹中的small.pdf
拷贝出来,作为fuzz的输入。这里,我们可以多拷贝几遍这个文件来作为输入,也可以收集其他一些pdf样本作为输入,以加快fuzz的进度mkdir afl-input cp ./afl-2.52b/testcases/others/pdf/small.pdf ./afl-input/
-
新建输出文件夹,用来存放fuzz出来的结果
mkdir afl-output cd ./afl-output mkdir poppler-0.82.0-1
-
在命令行中输入
afl-fuzz
查看其用法
-
再加上网上汇总的资料,我们可以使用下面的语句来fuzz:
afl-fuzz -i /path/to/input -o /path/to/output /path/to/program/ @@ /dev/null
其中,
path/to/inputsample
是指作为输入样本的文件夹的位置;同理,/path/to/output
是指存放fuzz出来的结果的地址;/path/to/program
是指被fuzz的二进制程序的地址;@@
是指当我们需要从文件中获取输入时,可以使用其来代替被测试程序命令行中输入文件名的位置;/dev/null
是指不输出错误信息到屏幕上 -
所以,根据上面的内容,我们使用下面的命令开始fuzz:
afl-fuzz -i ./afl-input/ -o ./afl-output/poppler-0.82.0-1 ./poppler-poppler-0.82.0/build/utils/pdftohtml @@ /dev/null
-
但当我们输入后,系统会如下报错:
-
那就输入命令,然后再次执行命令:
echo core >/proc/sys/kernel/core_pattern afl-fuzz -i ./afl-input/ -o ./afl-output/poppler-0.82.0-1 ./poppler-poppler-0.82.0/build/utils/pdftohtml @@ /dev/null
-
这次执行后,出现了一个之前fuzz从未出现的问题:
-
于是,经过查找,更改输入的命令为:
afl-fuzz -m 2G -i ./afl-input/ -o ./afl-output/poppler-0.82.0-1 ./poppler-poppler-0.82.0/build/utils/pdftohtml @@ /dev/null
这次可以成功执行了
-
界面如下所示:
-
对于
afl-output
文件中的内容,后面再说
单系统并行fuzz
-
在某些时候,只开一个fuzz的效率并不高,所以可以考虑单系统并行fuzz,每个cpu内核执行一个fuzz实例
-
首先需要确定自己的机器确实有多个核心来进行并行fuzz
-
然后,与之前命令不同的地方在于,通过参数
-M
指定主fuzz,进行确定性测试;通过参数-S
指定从fuzz,进行完全随机的测试 -
所以,可以使用如下命令进行fuzz:
afl-fuzz -i ./afl-input/ -o ./afl-output/poppler-0.82.0-1 -M fuzzer1 ./poppler-poppler-0.82.0/build/utils/pdftohtml @@ /dev/null afl-fuzz -i ./afl-input/ -o ./afl-output/poppler-0.82.0-1 -S fuzzer2 ./poppler-poppler-0.82.0/build/utils/pdftohtml @@ /dev/null afl-fuzz -i ./afl-input/ -o ./afl-output/poppler-0.82.0-1 -S fuzzer3 ./poppler-poppler-0.82.0/build/utils/pdftohtml @@ /dev/null afl-fuzz -i ./afl-input/ -o ./afl-output/poppler-0.82.0-1 -S fuzzer4 ./poppler-poppler-0.82.0/build/utils/pdftohtml @@ /dev/null afl-fuzz -i ./afl-input/ -o ./afl-output/poppler-0.82.0-1 -S fuzzer5 ./poppler-poppler-0.82.0/build/utils/pdftohtml @@ /dev/null
-
展示一下(此后的图均是最近用工作站对poppler-0.26进行的fuzz,其中fuzzer5在几天前被我停掉了):
-
看一下
afl-output/poppler-0.26.0-3
中的文件:
当使用并行fuzz的时候,每个fuzz都会生成一个单独的文件夹,进入其中一个,crashes
中的就是可以导致被fuzz程序crash的输入实例,这里一共fuzz出来了11个。其中,sig:11
表示段错误,比如引用了空指针;sig:06
表示可能执行了abort\assert函数,或者是double free
- 我们可以试着将id:000000的文件输入到被测试程序中,复现一下:
使用gdb进一步调试分析
- 还在学习