使用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进一步调试分析

  • 还在学习

本节参考:

AFL漏洞挖掘技术漫谈(一):用AFL开始你的第一次Fuzzing

posted @ 2019-11-09 22:11  月如霜  阅读(775)  评论(0编辑  收藏  举报