Fuzzing101-Xpdf

Fuzzing101-Xpdf

环境

插桩编译

1
2
3
CC=$HOME/AFLplusplus/afl-clang-fast CXX=$HOME/AFLplusplus/afl-clang-fast++ ./configure --prefix="$HOME/fuzzing_xpdf/install/"
make
make install
  • 设置CCCXX环境变量,从而使用afl-clang-fast进行编译插桩
  • 编辑配置文件,指定安装目录

编译过程如下图,途中会显示afl-cc++

1

Fuzzing

1
afl-fuzz -i $HOME/fuzzing_xpdf/pdf_examples/ -o $HOME/fuzzing_xpdf/out/ -s 123 -- $HOME/fuzzing_xpdf/install/bin/pdftotext @@ $HOME/fuzzing_xpdf/output
  • -i参数指定需要fuzzing的目标文件
  • -s参数指定使用的静态随机种子
  • @@为生成文件样本进行输入,而不是标准输入
  • output路径是pdftotext文件执行后所生成的静态文件

fuzzing之前需要在命令行输入echo core >/proc/sys/kernel/core_pattern,为了能够存储程序崩溃的情况

2

fuzzing速度非常快,一分钟就出crash样本了

3

复现崩溃

会发现打印了十分多的信息,这是因为使用afl++插桩时会开启内存泄漏探测,因此在复现时应该使用原来的编译器编译

4

1
2
CFLAGS="-g -O0" CXXFLAGS="-g -O0" ./configure --prefix="$HOME/fuzzing_xpdf/install/"
make && make install
  • -g参数增加调试信息
  • -O0关闭优化方便调试

重新运行一次样本

5

调试

使用gdb分析一下崩溃的原因

  • 首先使用gdb加载pdftotext

7

  • 其次,设置参数

8

  • 最后运行,输入bt查看栈回溯,可以看到会不断调用getObj函数,因此可能是不断递归造成的崩溃

6

函数调用流程

1
2
3
4
5
6
7
8
9
10
11
Parser::getObj(Parser.cc:94)
-->
Parser::makeStream(Parser.cc:156)
-->
Object::dictLookup(Object.h:253)
-->
Dict::lookup(Dict.cc:76)
-->
Object::fetch(Object.cc:106)
-->
XRef::fetch(XRef.cc:823)

源码分析

函数递归开头在getObj函数中处理流数据,会使用makeStream函数处理数据

9

通过dictLookup函数搜索Length获取流数据的长度

![11](D:\pwn\fuzz\Fuzzing101\Exercise 1\img\11.png)

通过键值搜索对象,若是对象不为空则调用fetch函数

12

若对象是引用对象则会调用XRef::fetch函数,这里就是漏洞存在点,这里并没有判断引用的对象是否是自身。

13

XRef::fetch内部又调用了getObj函数

14

通过源码分析发现pdf对象内部是可以调用间接对象的,但是代码没有判断当前对象与调用的间接对象是否是相同对象,那么则会发送crash样本发生的情况,会不断递归调用getObj函数

pdf相关知识

为了分析crash样本崩溃的原因需要掌握pdf相关知识

这个网站介绍的非常详细https://lazymind.me/2017/10/pdf-structure/,这里简单记录一下

  • PDF文档结构是由许多PDF对象组成

  • PDF对象分为直接对象与间接对象

  • 直接对象类型

    • 布尔类型
    • 数值类型
    • 字符串
    • 名称
    • 数组
    • 字典
    • 流对象
    • 空对象
  • 间接对象

1
2
3
4
5
6
1 0 obj
...
endobj

#引用对象
1 0 R #代表引用上述对象

crash样本分析

下图是样本的部分数据流,可以发现在7 0 obj间接对象中又交叉引用了7 0 R即对象本身与源码分析的情况一致,间接对象本身引用了自身导致了递归调用

14

崩溃样本构造

一个正常pdf的例子

16

正常pdf的数据流

17

修改后的pdf的数据流

18

构造成功

19

参考链接

https://github.com/antonio-morales/Fuzzing101/tree/main/Exercise%201

https://github.com/zxyle/PDF-Explained/blob/master/chapter2.md

https://lazymind.me/2017/10/pdf-structure/

https://juejin.cn/post/7023691050757652494#heading-18

https://blog.csdn.net/fxbjye/article/details/115460327

https://lazymind.me/2017/10/pdf-structure/

https://zxyle.github.io/PDF-Explained/chapter2.html

https://www.cnblogs.com/warcraft/p/10998541.html


Fuzzing101-Xpdf
https://h0pe-ay.github.io/Fuzzing101-Xpdf/
作者
hope
发布于
2024年2月3日
许可协议