avncharlie/PeAR

GitHub: avncharlie/PeAR

基于 GTIRB 框架的高性能二进制静态插桩工具,为 Linux 和 Windows 二进制文件添加 AFL Fuzzing 插桩及覆盖率跟踪能力。

Stars: 13 | Forks: 5

# PeAR PeAR 是一个基于 GTIRB 框架构建的二进制插桩工具,可以为 x64 Linux 和 x86/x64 Windows 二进制文件添加 AFL++ 或 WinAFL 插桩。它还支持为 x64/ARM64 Linux 二进制文件添加覆盖率跟踪插桩。它可以轻松扩展以开发其他二进制插桩工具。 ## 功能特性 **多平台二进制 Fuzzing 和跟踪。** 以下是 PeAR 实现的特定重写器的详细信息。你可能还应该使用 `--ir-cache` 选项来缓存反汇编后的二进制 IR,但这在示例中被省略了。 **对来自任何地方的二进制文件进行插桩。** PeAR 确保插桩后的二进制文件保留原始二进制文件的属性(共享库、rpath、PIE、exec stack 和栈大小)。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++ Rewriter 为 x64 Linux 二进制文件添加 AFL++ 插桩以进行 Fuzzing。 - 支持高级 Fuzzing 模式: - **Deferred mode(延迟模式)**:通过在特定点开始 Fuzzing 来跳过程序初始化 - **Persistent mode(持久模式)**:在不重启二进制文件的情况下重复 Fuzz 目标函数,显著提高性能 - **Shared memory fuzzing(共享内存 Fuzzing)**:在 Fuzzer 和目标程序之间使用共享内存传输测试用例,显著提高性能 - 这需要编写一个共享内存 Hook 来将测试用例传输到目标程序。参见 [hook.c](sharedmem_hook_template/hook.c) 示例。 - 示例用法: - `./PeAR.sh --input-binary program --output-dir out --gen-binary AFL++` - Deferred: `./PeAR.sh --input-binary program --output-dir out --gen-binary AFL++ --deferred-fuzz-function process_input` - Deferred+persistent: `./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` - Deferred+persistent+sharedmem: `./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 Rewriter 为 x86 或 x64 Windows 二进制文件添加 WinAFL 插桩以进行 Fuzzing。 - 示例用法:`./PeAR.bat --input-binary program.exe --output-dir out --gen-binary WinAFL --target-func 0x401000` ### Trace Rewriter 向 Linux 二进制文件添加基本块跟踪。当运行插桩后的二进制文件时,它将输出覆盖率文件:`..cov`。可以处理该文件以显示在该次执行期间运行的指令,或者生成 EZCOV 文件以与 [Cartographer Ghidra plugin](https://github.com/nccgroup/Cartographer) 配合使用来可视化执行情况。 Trace 重写器在覆盖率跟踪方面比 DynamoRIO drcov 更快。在 x64 系统上,它的 slowdown 约为 10 倍,而 DynamoRIO drcov 约为 80 倍。在 ARM64 系统上,它的 slowdown 约为 20 倍,而 DynamoRIO drcov 约为 40 倍。 - 选项: - `--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` ### Identity Rewriter 一个诊断性重写器,将二进制文件提升为 GTIRB IR 并尝试在没有任何转换的情况下重新生成它。这对于以下情况很有用: - 测试 GTIRB 是否能正确反汇编和重组二进制文件 - 获取二进制文件的汇编源代码以便在重新组装前进行手动修补(使用 Regenerate 重写器) - 示例用法: - `pear --input-binary program --output-dir out --gen-binary Identity` - `pear --input-binary program --output-dir out --gen-asm Identity` ### Regenerate Rewriter 从插桩后的汇编源代码重新生成二进制文件,同时保留原始二进制文件的属性。 - 示例用法: - 首先获取程序汇编:`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 -r requirements.txt` 安装依赖项。 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 -r requirements.txt` 安装依赖项。 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 Security 应用程序 -> Virus and threat protection(病毒和威胁防护) -> Virus and threat protection settings(病毒和威胁防护设置)下的 'Manage settings'(管理设置) -> 关闭 'Real-time protection'(实时保护)。 运行测试需要: 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` 选项。 我建议在 pytest 中使用 `-v -rA -s` 参数,这样你就可以实时查看测试运行情况,包括在运行插桩测试二进制文件时的 WinAFL/AFL++ UI。如果你想隐藏此 UI,请使用 `--hide-afl-ui`。
标签:AFL++, ARM64, Binary Instrumentation, CISA项目, DNS 反向解析, DNS 解析, Fuzzer, Fuzzing, Ghidra, Go语言工具, GTIRB, WinAFL, x64, XXE攻击, 二进制安全, 二进制检测, 二进制重写, 云安全监控, 云资产清单, 代码覆盖率, 威胁情报, 安全测试, 开发者工具, 性能优化, 攻击性安全, 检测绕过, 灰盒测试, 网络安全, 请求拦截, 逆向工具, 逆向工程, 隐私保护, 静态分析