Fuzz学习笔记(二)—— TrapFuzzer环境搭建
- TrapFuzzer介绍
- 基本用法
- 1. 插桩
- 2. 配置config.json
- 3. 调试
- 4. Fuzz
- 编译TrapFuzzer-gdb
- Linux
- 下载源码
- 安装依赖项
- 编译
- 常见问题
- relocation R_X86_64_32 against hidden symbol `__TMC_END__' can not be used when making a shared object
- Windows
- 安装Cygwin
- 软件包选择
- 环境变量
- 注意事项
- 编译
- 常见问题
- fatal error: linux/limits.h: No such file or directory
- 参考资料
TrapFuzzer介绍
描述:TrapFuzzer 是一个基于断点的覆盖率模糊测试工具,它专为大型和复杂的软件设计,如果使用动态二进制检测工具,速度会很慢。TrapFuzzer的特点是通过IDA获取代码中的基本块,从而对每个基本块进行插桩并获取覆盖率,目前仅支持x86架构。
项目地址:https://github.com/hac425xxx/trapfuzzer
基本用法
测试对象:火狐游览器
注意
:本次演示仅介绍用法,并无实际意义。
1. 插桩
修改bb-patcher.py:
运行:
运行结果:
其中,patch文件夹
里存放着patch后的文件:
用IDA打开,发现程序所有基本块的首字节已经被patch成0xCC(INT 3)了:
然后需要用patch后的文件替换源文件:
xxx.i64
是ida64的数据库文件,由源文件分析得到。
xxx-bb.txt
记录了相关patch信息,包括文件名、基本块地址、源指令等等。
2. 配置config.json
{
"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提供
3. 调试
运行healer.exe,能显示单次Fuzz基本块的覆盖记录及模块调用情况,可从中找到需结束进程的目标位置。
4. Fuzz
python trap_fuzzer.py
在out文件夹中查看fuzz的输出信息,本篇只是演示用法因此没有产生crash:
编译TrapFuzzer-gdb
Linux
下载源码
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
常见问题
relocation R_X86_64_32 against hidden symbol `TMC_END’ can not be used when making a shared object
解决方案:使用当前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’
Windows
安装Cygwin
官网:https://www.cygwin.com/
软件包选择
- Devel
- cygwin-devel
- libncurses-devel
- binutils
- gcc-g++
- make
- automake
- autoconf
- git
- libtool
- bison
- texinfo
- flex
- Shells
- bash
- Interpreters
- perl
- python
- ruby
环境变量
- 右键点击【此电脑】,依次点击【属性】-【高级系统设置】-【高级】-【环境变量】-【系统变量】
- 双击【PATH】,在末尾追加【X:…\cygwin64\bin目录】
注意事项
- 如果外部环境已经安装过git,需要先将git从环境变量中移除
- 由于一些特殊函数需要链接到ncurses库,因此不能使用静态编译
编译
$ cd trapfuzzer-gdb
$ mkdir build
$ cd build
$ CXX="g++ -fPIC" CC="gcc -fPIC" LDFLAGS=$(pkg-config --cflags --libs ncurses) ../configure --without-python
$ make -j4
常见问题
fatal error: linux/limits.h: No such file or directory
解决方案:将#include <linux/limits.h>
修改为#include <limits.h>
参考资料
Bilibili - Fuzz分享
D2T2 - trapfuzzer- Coverage-guided Binary Fuzzing with Breakpoints - Sili Luo.pdf
奇安信攻防社区 - trapfuzzer 源码分析