Fuzz101_xpdf

项目的搭建、fuzz、调试

首先尽量使用ubuntu20来进行fuzz,用ubuntu18产出的pdf与ubuntu20的不一样,十分影响调试过程
流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mkdir fuzzing_xpdf
cd $HOME/fuzzing_xpdf
wget https://dl.xpdfreader.com/old/xpdf-3.02.tar.gz
sudo tar -xvzf xpdf-3.02.tar.gz
cd xpdf-3.02
sudo ./configure CC="afl-gcc" CXX="afl-g++" --prefix="$HOME/fuzzing_xpdf/install"
sudo make -j$(nproc)
sudo make install
#下载测试案例
cd $HOME/fuzzing_xpdf
mkdir pdf_examples && cd pdf_examples
wget https://github.com/mozilla/pdf.js-sample-files/raw/master/helloworld.pdf
wget http://www.africau.edu/images/default/sample.pdf
wget https://www.melbpc.org.au/wp-content/uploads/2017/10/small-example-pdf-file.pdf
#测试项目
$HOME/fuzzing_xpdf/install/bin/pdftotext $HOME/fuzzing_xpdf/pdf_examples/helloworld.pdf
#fuzz操作


#add
sudo su
echo core >/proc/sys/kernel/core_pattern
exit

使用程序运行生成的crashes文件,如图
avatar
完全不同与使用ubuntu18的crash
当程序中出现crashes后,使用gdb调试
命令

1
2
3
gdb --args $HOME/fuzzing_xpdf/install/bin/pdftotext $HOME/fuzzing_xpdf/out/default/crashes/id:000000,sig:11,src:000000+000123,time:429855,execs:42820,op:splice,rep:4
run
bt

栈回溯如图
avatar
显而易见发生了无限递归
发生的地方为Parser::getObj
此时重新构建项目方便调试

1
2
3
4
5
6
sudo rm -r $HOME/fuzzing_xpdf/install
cd $HOME/fuzzing_xpdf/xpdf-3.02/
sudo CFLAGS="-g -O0" CXXFLAGS="-g -O0" ./configure --prefix="$HOME/fuzzing_xpdf/install/"
make
make install
gdb --args $HOME/fuzzing_xpdf/install/bin/pdftotext $HOME/fuzzing_xpdf/out/default/crashes/id:000000,sig:11,src:000000+000123,time:429855,execs:42820,op:splice,rep:4 $HOME/fuzzing_xpdf/output

调试过程

1
2
3
4
5
bt #查看栈回溯
layout src #查看源代码
b Paeser::getObj #先在这个函数下断点
ignore 1 1000 #运行1000次
run

运行处1
avatar
运行处2(主要是在这里发生了递归)
avatar