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

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

环境变量

  1. 右键点击【此电脑】,依次点击【属性】-【高级系统设置】-【高级】-【环境变量】-【系统变量】
  2. 双击【PATH】,在末尾追加【X:…\cygwin64\bin目录】
    在这里插入图片描述

注意事项

  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 <linux/limits.h>修改为#include <limits.h>
在这里插入图片描述

参考资料

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值