Fuzz学习笔记(二)—— TrapFuzzer环境搭建

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架构。
Fuzz学习笔记(二)—— TrapFuzzer环境搭建_第1张图片
项目地址:https://github.com/hac425xxx/trapfuzzer

基本用法

测试对象:火狐游览器
注意:本次演示仅介绍用法,并无实际意义。

1. 插桩

修改bb-patcher.py:
在这里插入图片描述运行:
在这里插入图片描述运行结果:
Fuzz学习笔记(二)—— TrapFuzzer环境搭建_第2张图片
其中,patch文件夹里存放着patch后的文件:
在这里插入图片描述
用IDA打开,发现程序所有基本块的首字节已经被patch成0xCC(INT 3)了:
Fuzz学习笔记(二)—— TrapFuzzer环境搭建_第3张图片
然后需要用patch后的文件替换源文件:
Fuzz学习笔记(二)—— TrapFuzzer环境搭建_第4张图片
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基本块的覆盖记录及模块调用情况,可从中找到需结束进程的目标位置。
Fuzz学习笔记(二)—— TrapFuzzer环境搭建_第5张图片

4. Fuzz

python trap_fuzzer.py

Fuzz学习笔记(二)—— TrapFuzzer环境搭建_第6张图片
在out文件夹中查看fuzz的输出信息,本篇只是演示用法因此没有产生crash:
Fuzz学习笔记(二)—— TrapFuzzer环境搭建_第7张图片

编译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

Fuzz学习笔记(二)—— TrapFuzzer环境搭建_第8张图片
解决方案:使用当前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/
Fuzz学习笔记(二)—— TrapFuzzer环境搭建_第9张图片

Fuzz学习笔记(二)—— TrapFuzzer环境搭建_第10张图片

Fuzz学习笔记(二)—— TrapFuzzer环境搭建_第11张图片

Fuzz学习笔记(二)—— TrapFuzzer环境搭建_第12张图片

软件包选择

  • Devel
    • cygwin-devel
    • libncurses-devel
    • binutils
    • gcc-g++
    • make
    • automake
    • autoconf
    • git
    • libtool
    • bison
    • texinfo
    • flex
  • Shells
    • bash
  • Interpreters
    • perl
    • python
    • ruby

环境变量

  1. 右键点击【此电脑】,依次点击【属性】-【高级系统设置】-【高级】-【环境变量】-【系统变量】
  2. 双击【PATH】,在末尾追加【X:…\cygwin64\bin目录】
    Fuzz学习笔记(二)—— TrapFuzzer环境搭建_第13张图片

注意事项

  1. 如果外部环境已经安装过git,需要先将git从环境变量中移除
  2. 由于一些特殊函数需要链接到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 修改为#include
Fuzz学习笔记(二)—— TrapFuzzer环境搭建_第14张图片

参考资料

Bilibili - Fuzz分享
D2T2 - trapfuzzer- Coverage-guided Binary Fuzzing with Breakpoints - Sili Luo.pdf
奇安信攻防社区 - trapfuzzer 源码分析

你可能感兴趣的:(Fuzz,Fuzz,TrapFuzzer)