描述:TrapFuzzer 是一个基于断点的覆盖率模糊测试工具,它专为大型和复杂的软件设计,如果使用动态二进制检测工具,速度会很慢。TrapFuzzer的特点是通过IDA获取代码中的基本块,从而对每个基本块进行插桩并获取覆盖率,目前仅支持x86架构。
项目地址:https://github.com/hac425xxx/trapfuzzer
测试对象:火狐游览器
注意
:本次演示仅介绍用法,并无实际意义。
修改bb-patcher.py:
运行:
运行结果:
其中,patch文件夹
里存放着patch后的文件:
用IDA打开,发现程序所有基本块的首字节已经被patch成0xCC(INT 3)了:
然后需要用patch后的文件替换源文件:
xxx.i64
是ida64的数据库文件,由源文件分析得到。
xxx-bb.txt
记录了相关patch信息,包括文件名、基本块地址、源指令等等。
{
"tracer": "windbg-ext-tracer",
"mutator": "all",
"args": [
"C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe",
"C:\\Fuzz\\TrapFuzzer\\in\\1.jpg"
],
"basic_block_file_path": [
"C:\\Fuzz\\TrapFuzzer\\patch_test\\firefox.exe-bb.txt"
],
"coverage_module_name": [
"firefox.exe"
],
"file_read_by_target": "C:\\Fuzz\\TrapFuzzer\\test.jpg",
"manage_port": "8821",
"exit_basci_block_list": "0",
"output": "C:\\Fuzz\\TrapFuzzer\\out\\",
"testcase": "C:\\Fuzz\\TrapFuzzer\\in\\",
"patch_to_binary": false,
"resume_execution": false,
"tracer-binary":"C:\\Fuzz\\TrapFuzzer\\trapfuzzer-master\\healer.exe"
}
参数说明:
tracer
- 进行ptrace的模块名,无需修改
mutator
- 变异方式,参考mutator文件夹
args
- 待启动的文件和参数
basic_block_file_path
- 记录patch信息的文件
coverage_module_name
- patch程序的名字
file_read_by_target
- 每次Fuzz从in目录随机读取并变异
manage_port
- 管理端口
exit_basci_block_list
- 基本块地址,覆盖到这里后结束进程
output
- 存放Fuzz的输出信息
testcase
- 存放Fuzz的输入样本
patch_to_binary
- 是否将执行过的基本块原始指令写回文件,可提高效率
resume_execution
- 是否继续上次Fuzz
tracer-binary
- 由作者的另一个项目trapfuzzer-windows-agent提供
运行healer.exe,能显示单次Fuzz基本块的覆盖记录及模块调用情况,可从中找到需结束进程的目标位置。
python trap_fuzzer.py
在out文件夹中查看fuzz的输出信息,本篇只是演示用法因此没有产生crash:
git clone https://github.com/hac425xxx/trapfuzzer-gdb.git
apt-get install texinfo
cd trapfuzzer-gdb
mkdir build
cd build
CXX="g++ -fPIC -static" CC="gcc -fPIC -static" LDFLAGS="-lncurses" ../configure --enable-static=yes --without-python
make -j4
解决方案:使用当前gcc库中的crtbeginS.o替换crtbeginT.o
cp /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginT.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginT.orig.o
cp /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginS.o /usr/lib/gcc/x86_64-linux-gnu/9/crtbeginT.o
参考资料:gcc g++ 静态编译 -static 报错 crtbeginT.o: relocation R_X86_64_32 against hidden symbol `TMC_END’
$ cd trapfuzzer-gdb
$ mkdir build
$ cd build
$ CXX="g++ -fPIC" CC="gcc -fPIC" LDFLAGS=$(pkg-config --cflags --libs ncurses) ../configure --without-python
$ make -j4
Bilibili - Fuzz分享
D2T2 - trapfuzzer- Coverage-guided Binary Fuzzing with Breakpoints - Sili Luo.pdf
奇安信攻防社区 - trapfuzzer 源码分析