关于 reverse-engineering
指导 Agent 分析缺少源代码的二进制文件,涵盖初步检查、反编译和二进制比较。内容包括 Ghidra、radare2、Binary Ninja 脚本、C++ 模式识别和剥离符号的二进制分析。
主要功能
- 01使用命令行工具初步检查
- 02Ghidra 反编译与脚本编写
- 03radare2 分析与补丁
- 04Binary Ninja 脚本编写
- 05C++ 与剥离符号二进制分析
- 06二进制差异比较
适用场景
- 01调查未知可执行文件
- 02从编译产物中还原逻辑
- 03比较固件版本以查找补丁
- 04分析恶意软件或 CTF 二进制
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill reverse-engineering安装后在 Claude Code 中输入/reverse-engineering确认已加载。
详细介绍
逆向工程
用途
指导 Agent 对二进制文件进行逆向工程:设置 Ghidra 项目并反编译、使用 radare2 进行分析、编写 Binary Ninja 脚本、通过 strings/file/xxd 进行初步排查、识别 C++ 模式(虚函数表、RAII)、分析去符号二进制文件,以及使用 Diaphora 或 BinDiff 进行差异比较。
适用场景
- 在没有源代码的情况下分析未知二进制文件
- 从编译后的可执行文件中还原算法逻辑
- 比较两个固件版本以查找漏洞补丁
- 理解恶意软件或 CTF 挑战二进制文件
- 从去符号的 ELF/PE 文件中还原符号
- 使用 Ghidra 或 r2 脚本自动化分析
工作流
1. 初步排查
file suspicious_binary
strings -n 8 suspicious_binary | head -50
strings -el suspicious_binary # UTF-16 LE
xxd suspicious_binary | head -20
readelf -h suspicious_binary # ELF
objdump -d -M intel suspicious_binary | head -40
# Check protections
checksec --file=suspicious_binary
| 命令 | 可揭示的信息 |
|---|---|
file | 架构、静态/动态、是否去符号 |
strings | URL、路径、错误消息、密钥 |
readelf -s | 符号表(如果未去符号) |
nm -D | 动态符号 |
checksec | RELRO、NX、PIE、栈保护 canary |
2. Ghidra 工作流
# Headless analysis
analyzeHeadless /tmp/ghidra_projects MyProject \
-import suspicious_binary \
-postScript ExportDecompile.java
# GUI: File → New Project → Import File → Analyze (Yes)
关键步骤:
- 自动分析 — 等待 Ghidra 完成反汇编
- 定义函数 — 如果未识别到入口点,可在其上按
F - 反编译器 — Window → Decompiler(类 C 输出)
- 重命名 — 在变量/函数上按
L,让名称更清晰 - 交叉引用 — 在函数/数据上按
Ctrl+Shift+F
// Ghidra script (Java) — list functions > 100 bytes
import ghidra.program.model.listing.*;
FunctionManager fm = currentProgram.getFunctionManager();
for (Function f : fm.getFunctions(true)) {
if (f.getBody().getNumAddresses() > 100)
println(f.getName() + " @ " + f.getEntryPoint());
}
# Ghidra Python (Jython)
from ghidra.program.model.listing import FunctionManager
fm = currentProgram.getFunctionManager()
for f in fm.getFunctions(True):
print(f.getName(), f.getEntryPoint())
3. radare2 工作流
r2 suspicious_binary
[0x00001000]> aaa # analyze all
[0x00001000]> afl # list functions
[0x00001000]> pdf @ main # disassemble function
[0x00001000]> VV # visual graph mode
[0x00001000]> iz # strings in data sections
[0x00001000]> s sym.main; pdf
修补:
[0x00001000]> wx 9090 @ 0x401234 # write NOPs
[0x00001000]> wci 0x401234 # insert instruction
[0x00001000]> wt modified_binary
# r2 scripting
r2 -qc 'aaa; afl' suspicious_binary
r2 -i analysis.r2 suspicious_binary
4. Binary Ninja 脚本编写
# BN Python API
import binaryninja as bn
bv = bn.load("suspicious_binary")
for func in bv.functions:
if func.name.startswith("sub_"):
hlil = func.hlil
for block in hlil:
print(block)
5. C++ 模式识别
// Vtable pattern in disassembly
// mov rax, [rdi] ; load vtable pointer
// call [rax+0x10] ; virtual call at offset
// Constructor pattern
// mov [obj], offset vtable
| 模式 | 特征 |
|---|---|
| 虚函数表 | .data.rel.ro 节、函数指针数组 |
| RAII | 成对的构造函数/析构函数调用、异常处理落地点 |
| 模板 | 修饰名 _Z...、每种类型都有重复逻辑 |
| std::string | 内联的 SSO 缓冲区,或偏移量 0 处的堆指针 |
# Demangle C++ symbols
c++filt _ZN4Math3addEii
6. 去符号二进制文件还原
# Find main via __libc_start_main
readelf -s binary | grep -E 'main|start'
# Or r2: afl~entry
# FLIRT signatures (Ghidra/BN) — match libc patterns
# Stack string analysis in Ghidra decompiler
策略:
- 通过 libc 初始化或入口点识别
main - 查找系统调用(Linux 上的
syscall指令) - 通过字符串交叉引用定位错误处理程序
- 对加密节进行熵分析
7. 二进制差异比较
# Diaphora (Ghidra/IDA plugin)
# Export from both binaries, run diff
# BinDiff (commercial, IDA/Ghidra)
bindiff old.i64 new.i64
# Simple hash diff
sha256sum firmware_v1 firmware_v2
diff <(objdump -d v1) <(objdump -d v2) | head
使用差异比较,在更新后查找已修补漏洞的函数。
8. 逆向工程决策树
Binary type?
├── ELF/Linux → Ghidra + r2 + readelf
├── PE/Windows → Ghidra + PE-bear + x64dbg reference
├── Firmware → binwalk extract → Ghidra on architecture
└── Obfuscated → dynamic analysis (gdb/ltrace) first
常见问题
| 症状 | 原因 | 修复方法 |
|---|---|---|
| Ghidra 反编译器失败 | 间接跳转、类型错误 | 修正函数签名;定义结构体 |
| r2 分析不完整 | 二进制文件过大 | 先运行 aaa,再运行 aac;提高分析深度 |
| 架构错误 | ARM 与 Thumb 混淆、MIPS | 设置 -a arm 或选择正确的 Ghidra 语言 |
| 反调试陷阱 | ptrace 检查 | 修补,或在 QEMU 中使用 -gdb |
| 加壳二进制文件 | UPX 等 | 使用 upx -d 或手动脱壳 |
| 字符串没有交叉引用 | PIE/RELRO | 跟踪 GOT;进行运行时分析 |
相关技能
skills/binaries/elf-inspection— ELF 结构分析skills/debuggers/gdb— 动态分析补充skills/runtimes/binary-hardening— 了解被绕过的缓解措施skills/security/kernel-security— 内核逆向工程和 CVE 分析skills/low-level-programming/assembly-x86— 阅读反汇编代码skills/low-level-programming/assembly-arm— ARM 二进制分析
评论
支持 Markdown