• 使用afl-fuzz测试poppler(二)


    上节内容:使用afl-fuzz测试poppler(一)

    开始fuzz

    • 在fuzz之前,先看下alf-2.52b estcases文件夹,这里面存放的就是最初用来作为输入的样本

    • poppler一款pdf处理工具,所以,我们将 estcasesotherspdf文件夹中的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表示可能执行了abortassert函数,或者是double free

    • 我们可以试着将id:000000的文件输入到被测试程序中,复现一下:

    使用gdb进一步调试分析

    • 还在学习

    本节参考:

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

  • 相关阅读:
    开源框架---通过Bazel编译使用tensorflow c++ API 记录
    图像处理---视频<->图片
    C++ ---释放内存(new和delete)
    目标检测---搬砖一个ALPR自动车牌识别的环境
    ubuntu系统---ubuntu16.04 + virtualenv + py2.7 + tf1.5.0 + keras2.2.4 + opencv2.4.9 +Numpy1.14
    Ubuntu系统---中英文问题小记
    Ubuntu系统---nvidia驱动下载之问题
    Ubuntu系统---又显示nvidia-smi 未找到命令
    Ubuntu系统---安装English版本之后的一些工作
    Ubuntu系统---安装“搜狗拼音法”导致桌面打不开
  • 原文地址:https://www.cnblogs.com/xrblog/p/11828118.html
Copyright © 2020-2023  润新知