# Download Xpdf 3.02 && build Xpdf wget https://dl.xpdfreader.com/old/xpdf-3.02.tar.gz tar -xvzf xpdf-3.02.tar.gz cd xpdf-3.02
./configure --prefix="$HOME/fuzzing_xpdf/install/" make make install
# Download PDF examples to test Xpdf 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
rm -r $HOME/fuzzing_xpdf/install cd $HOME/fuzzing_xpdf/xpdf-3.02/ make clean
编译xpdf并用 afl-clang-fast 编译器,进行插桩
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
hpp@swikar:~/fuzzing_xpdf/out/default/crashes$ ls id:000000,sig:11,src:001045,time:342537,execs:245377,op:havoc,rep:15 id:000001,sig:11,src:000229,time:505563,execs:344967,op:havoc,rep:2 id:000002,sig:11,src:001638,time:566771,execs:383537,op:havoc,rep:1 id:000003,sig:11,src:001753+000851,time:820662,execs:526503,op:splice,rep:2 README.txt
将这些文件放到gdb中调试,看看是哪里出错
首先重新编译
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
//定义两个全局变量 #define MAX_OBJ_CALLS 10000 int callCount = 0;
while (!buf1.isCmd(">>") && !buf1.isEOF()) { if (!buf1.isName()) { error(getPos(), "Dictionary key must be a name object"); shift(); } else { key = copyString(buf1.getName()); shift(); if (buf1.isEOF() || buf1.isError()) { gfree(key); break; }
// 增加调用次数限制 if (callCount >= MAX_OBJ_CALLS) { error(getPos(), "Too many calls to getObj, possible infinite loop"); gfree(key); obj->initError(); // 初始化为错误对象 break; } callCount++; // 增加调用次数 obj->dictAdd(key, getObj(&obj2, fileKey, encAlgorithm, keyLength, objNum, objGen)); } }
评论区
欢迎你留下宝贵的意见,昵称输入QQ号会显示QQ头像哦~