pear-labs/PeAR
GitHub: pear-labs/PeAR
PeAR 是一个基于 GTIRB 的二进制仪器工具,为 Linux 与 Windows 提供高性能模糊测试与覆盖率跟踪能力。
Stars: 13 | Forks: 5
# PeAR
PeAR 是一个使用 GTIRB 框架构建的二进制仪器工具
它可以为 x64 Linux 和 x86/x64 Windows 二进制文件添加 AFL++ 或 WinAFL 仪器
同时它也支持为 x64/ARM64 Linux 二进制文件添加覆盖率跟踪仪器
它可以轻松扩展以开发其他二进制仪器工具
## 功能
**多平台二进制模糊测试和跟踪。**PeAR 实现的特定重写器详细信息如下。您可能需要使用 `--ir-cache` 选项来缓存反汇编的二进制 IR,但此选项在示例中省略。
**从任何地方对二进制文件进行仪器化。**PeAR 确保仪器化的二进制文件保留原始二进制文件的属性(共享库、rpath、PIE、执行堆栈和堆栈大小)。PeAR 还可以重新生成 Windows 和 Linux 二进制文件,而无需使用其运行系统上所依赖的共享库。这使得对来自其他系统的二进制文件进行仪器化变得容易。
**实用。**PeAR 使用 GTIRB,一个功能强大的二进制重写框架,能够成功地对真实世界的二进制文件进行仪器化,即使它们被剥离(例如可以成功地对 libxml2、openssh、nginx 进行仪器化)。
**导入 Ghidra 函数名称。**PeAR 可以将 Ghidra 中的函数名称插入到剥离的二进制文件中。使用 [ghidra_get_function_names.py](pear/tools/ghidra_get_function_names.py) 脚本生成函数地址到名称的映射,然后将其传递给 `--func-names` 选项以在仪器化二进制文件时使用。如果您只想添加函数名称而不做其他操作,请使用 Identity 重写器。
### AFL++ 重写器
为模糊测试 x64 Linux 二进制文件添加 AFL++ 仪器化。
- 支持高级模糊模式:
- **延迟模式**:通过从特定点开始模糊测试来跳过程序初始化
- **持久模式**:在不重启二进制文件的情况下反复模糊测试目标函数,显著提高性能
- **共享内存模糊测试**:在模糊器和目标程序之间使用共享内存传输测试用例,显著提高性能
- 这需要编写一个共享内存钩子来将测试用例传输到目标程序。请参见 [hook.c](sharedmem_hook_template/hook.c) 获取示例
- 示例用法:
- `./PeAR.sh --input-binary program --output-dir out --gen-binary AFL++`
- 延迟模式:`./PeAR.sh --input-binary program --output-dir out --gen-binary AFL++ --deferred-fuzz-function process_input`
- 延迟+持久模式:`./PeAR.sh --input-binary program --output-dir out --gen-binary AFL++ --deferred-fuzz-function process_input --persistent-mode-function process_input --persistent-mode-count 10000`
- 延迟+持久+共享内存模式:`./PeAR.sh --input-binary program --output-dir out --gen-binary AFL++ --deferred-fuzz-function process_input --persistent-mode-function process_input --persistent-mode-count 10000 --sharedmem-call-function process_input --sharedmem-obj hook.o`
- 运行 `./PeAR.sh --input-binary program --output-dir out --gen-binary AFL++ -h`
获取更多选项。
### WinAFL 重写器
为模糊测试 x86 或 x64 Windows 二进制文件添加 WinAFL 仪器化。
- 示例用法:`./PeAR.bat --input-binary program.exe --output-dir out --gen-binary WinAFL --target-func 0x401000`
### 跟踪重写器
为 Linux 二进制文件添加基本块跟踪。当运行仪器化的二进制文件时,它将输出覆盖率文件:`..cov`。这可以处理以显示在执行期间运行的指令,或生成 EZCOV 文件以与 [Cartographer Ghidra 插件](https://github.com/nccgroup/Cartographer)
一起可视化执行。
跟踪重写器比 DynamoRIO drcov 更快用于覆盖率跟踪。在 x64 系统上,它比 DynamoRIO drcov 的 ~80 倍慢大约慢 10 倍。在 ARM64 系统上,它比 DynamoRIO drcov 的 ~40 倍慢大约慢 20 倍。
- 选项:
- `--print-execution`:打印正在执行的指令
- `--add-coverage`:生成运行时的覆盖率输出
- `--fast`:使用快速跟踪(可能在异常终止时丢失数据)
- `--slow`:使用慢速跟踪(在异常终止时记录更多信息)
- 示例用法:
- 仪器化程序:`pear --input-binary program --output-dir out --gen-binary Trace --add-coverage --fast`
- 这也会生成一个辅助信息文件,例如 `out/program.Trace.basicblockinfo.json`。
- 打印执行的指令:`python3 pear/tools/parse_coverage.py --aux-info out/program.Trace.basicblockinfo.json --cov-file PrintExecution`
- 生成 EZCOV:`python3 pear/tools/parse_coverage.py --aux-info out/program.Trace.basicblockinfo.json --cov-file GenerateEZCOV`
### 身份重写器
一个诊断重写器,将二进制文件提升为 GTIRB IR 并尝试在不进行任何转换的情况下重新生成它。这对于以下用途很有用:
- 测试 GTIRB 是否能正确反汇编和重新组装二进制文件
- 在使用 Regenerate 重写器重新组装之前,获取二进制文件的汇编源代码以进行手动修补
- 示例用法:
- `pear --input-binary program --output-dir out --gen-binary Identity`
- `pear --input-binary program --output-dir out --gen-asm Identity`
### 再生重写器
从仪器化的汇编源代码重新生成二进制文件,同时保留原始二进制文件的属性。
- 示例用法:
- 首先获取程序汇编代码:`pear --input-binary program --output-dir out --gen-binary Identity`
- 按需修改此汇编代码。
- 从修改后的汇编代码重新生成二进制文件:`pear --input-binary program --output-dir out --gen-binary Regenerate --from-asm out/program.Identity.S`
## 使用 Docker 运行(推荐用于 Linux)
1. 确保已安装 Docker 并且可以非 root 方式运行。
2. 安装 Python 3,最大版本为 Python 3.10。
3. (可选但推荐)创建一个虚拟环境来运行 PeAR。
4. 使用 `python -m pip install .` 安装依赖项。
5. 使用 `./PeAR.sh` 运行。此 shell 脚本为 `ddisasm` 和
`gtirb-pprinter` 设置了通过 Docker 的直通包装器。
要自行使用包装器,请运行 `source ./enable_wrappers.sh`。然后运行
`deactivate_wrappers` 以移除它们。
## 本地运行(推荐用于 Windows)
1. 在此处下载 `ddisasm` 和 `gtirb-pprinter` 二进制文件:
https://download.grammatech.com/gtirb/files/windows-release/,并将它们添加到
您的 PATH 中。
2. 安装 Python 3,最大版本为 Python 3.10。
3. (可选但推荐)创建一个虚拟环境来运行 PeAR。
4. 使用 `python -m pip install .` 安装依赖项。
5. 运行 `python -m pear -h` 或 `.\PeAR.bat -h` 开始使用。
## 运行测试
在 Windows 上运行测试,请执行:`pytest .\pear\ -v -rA -s --ir-cache IR_CACHE --vcvarsall-loc VCVARSALL_LOC --winafl32-afl-fuzz-loc AFL32_LOC --winafl64-afl-fuzz-loc AFL64_LOC`。
Windows Defender 可能会阻止测试正常运行。要在运行测试时临时
禁用它,请打开 Windows 安全应用 -> 病毒和
威胁保护 -> “管理设置”下的病毒和威胁保护
设置 -> 关闭“实时保护”。
运行测试需要:
1. 您的 `vcvarsall.bat` 的位置。这用于运行 MSVC
开发环境,用于使用不同架构测试 PeAR。在我的计算机上,位置是:
`C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat`。
2. 32 位和 64 位版本的 WinAFL 构建(`afl-fuzz` 二进制文件)
`--ir-cache` 参数是可选的,但建议使用以测试速度。
为其提供一个目录(用于缓存测试运行期间生成的 IR 文件)。
对于 Linux,请使用 `pytest.sh`(它为 GTIRB 工具设置 Docker 包装器),并省略
`--vcvarsall-loc`、`--winafl32-afl-fuzz-loc`、
`--winafl64-afl-fuzz-loc` 选项。
我建议使用 `-v -rA -s` 参数运行 pytest,以便您可以实时查看测试运行情况,包括 WinAFL/AFL++ UI,当仪器化的测试二进制文件运行时。如果要隐藏此 UI,请使用 `--hide-afl-ui`。
标签:AFL++, ARM64, Ghidra, GTIRB, IR缓存, PIE, WinAFL, x64, x86, 二叉代码插桩, 二进制工具开发, 二进制重写, 代码覆盖率, 共享内存模糊测试, 共享库, 函数符号导入, 剥离二进制, 可执行栈, 延迟模式, 性能优化, 持久化模式, 栈保护, 检测绕过, 缓存反汇编IR, 覆盖率跟踪, 请求拦截, 逆向工具, 重定位