Fuzz-Exercise-Level1

zhaojunqi Lv3

Fuzzing101 Exercise 1:

这是一个开源的Fuzzing学习的仓库:https://github.com/antonio-morales/Fuzzing101/tree/main/ 里面有十个fuzz相关的练习,适合入门fuzz

10道练习题都是在ubuntu20.04环境下进行的,所以需要先安装一个ubuntu20.04的虚拟机用于本次fuzz学习。它给出了一个ubuntu20.04虚拟机镜像,

下载地址: https://drive.google.com/file/d/1_m1x-SHcm7Muov2mlmbbt8nkrMYp0Q3K/view , 虚拟机用户密码:fuzz

Exercise 1 Xpdf_CVE-2019-13288:

1. 下载并编译fuzz的目标: Xpdf

为要进行模糊测试的项目创建一个新目录:

1
2
cd $HOME
mkdir fuzzing_xpdf && cd fuzzing_xpdf/

需要安装一些基础的build工具(即 make 和 gcc)。

1
sudo apt install build-essential

下载fuzz目标: Xpdf 3.02:

1
2
wget https://dl.xpdfreader.com/old/xpdf-3.02.tar.gz
tar -xvzf xpdf-3.02.tar.gz

编译Xpdf:

1
2
3
4
5
cd xpdf-3.02
sudo apt update && sudo apt install -y build-essential gcc
./configure --prefix="$HOME/fuzzing_xpdf/install/"
make
make install

下载一个pdf模板用来测试xpdf是否编译成功

1
2
3
cd $HOME/fuzzing_xpdf
mkdir pdf_examples && cd pdf_examples
wget https://github.com/mozilla/pdf.js-sample-files/raw/master/helloworld.pdf

测试Xpdf的其中一个编译产物pdfinfo的正确性

1
$HOME/fuzzing_xpdf/install/bin/pdfinfo -box -meta $HOME/fuzzing_xpdf/pdf_examples/helloworld.pdf

如果编译正确,输出结果类似于:

2. 配置AFL++

首先在虚拟机中下载docker:

1
2
sudo apt install docker
sudo apt install -y docker.io

由于docker需要配置代理才能拉取外网的docker镜像,所以:

1
sudo mkdir -p /etc/systemd/system/docker.service.d
1
2
3
4
5
6
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf >/dev/null <<'EOF'
[Service]
Environment="HTTP_PROXY=http://192.168.65.1:7890"
Environment="HTTPS_PROXY=http://192.168.65.1:7890"
Environment="NO_PROXY=localhost,192.168.65.1,::1"
EOF

此处192.168.65.1是虚拟机的host机的ip地址,7890为clash的端口号。且clash需要打开TUN模式。如果代理配置成功,那么虚拟机中就可以用docker pull拉取AFL++的镜像了:

1
2
docker pull aflplusplus/aflplusplus:latest
sudo docker run -ti --rm -v "$(pwd)":/workdir aflplusplus/aflplusplus #当前路径下的文件被重定向到容器中的/workdir目录下,在容器中对这个目录的操作也会影响host对应路径的文件系统

4. 运行AFL++对插桩版的Xpdf进行模糊测试:

编译插桩版AFL++:

先clean:

1
2
3
rm -r $HOME/fuzzing_xpdf/install
cd $HOME/fuzzing_xpdf/xpdf-3.02/
make clean

在docker中编译插桩版的AFL++:

1
2
3
4
export LLVM_CONFIG="llvm-config-11"
CC=$HOME/AFLplusplus/afl-clang-fast CXX=$HOME/AFLplusplus/afl-clang-fast++ ./configure --prefix="$HOME/fuzzing_xpdf/install/"
make
make install

运行AFL++:

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

5. AFL++的最终测试情况:

6. 用GDB调试第一个crash:

下载gdb:

1
2
sudo apt install gdb
gdb --version

用gdb调试需要编译有符号版本的目标程序(需要加-g选项)

1
2
3
4
5
6
rm -r $HOME/fuzzing_xpdf/install
cd $HOME/fuzzing_xpdf/xpdf-3.02/
make clean
CFLAGS="-g -O0" CXXFLAGS="-g -O0" ./configure --prefix="$HOME/fuzzing_xpdf/install/"
make
make install

在docker中用gdb启动目标程序:

1
gdb --args $HOME/fuzzing_xpdf/install/bin/pdftotext $HOME/fuzzing_xpdf/out/default/crashes/<your_filename> $HOME/fuzzing_xpdf/output

最后触发segment fault以后用bt指令查看栈得出结果:

发现调用了很多遍的Parser::getObj根据CVE-2019-13288的文档可以得出确实就是这个bug导致了无限递归

  • Title: Fuzz-Exercise-Level1
  • Author: zhaojunqi
  • Created at : 2026-03-10 16:21:01
  • Updated at : 2026-03-11 14:33:08
  • Link: https://redefine.ohevan.com/2026/03/10/Fuzz-Exercise-Level1/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments