mcpField
R
reverse-engineering

reverse-engineering

github.com/mohitmishra786安全272363 次安装18 周前更新
代码仓库

关于 reverse-engineering

指导 Agent 分析缺少源代码的二进制文件,涵盖初步检查、反编译和二进制比较。内容包括 Ghidra、radare2、Binary Ninja 脚本、C++ 模式识别和剥离符号的二进制分析。

主要功能

  1. 01使用命令行工具初步检查
  2. 02Ghidra 反编译与脚本编写
  3. 03radare2 分析与补丁
  4. 04Binary Ninja 脚本编写
  5. 05C++ 与剥离符号二进制分析
  6. 06二进制差异比较

适用场景

  1. 01调查未知可执行文件
  2. 02从编译产物中还原逻辑
  3. 03比较固件版本以查找补丁
  4. 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架构、静态/动态、是否去符号
stringsURL、路径、错误消息、密钥
readelf -s符号表(如果未去符号)
nm -D动态符号
checksecRELRO、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)

关键步骤:

  1. 自动分析 — 等待 Ghidra 完成反汇编
  2. 定义函数 — 如果未识别到入口点,可在其上按 F
  3. 反编译器 — Window → Decompiler(类 C 输出)
  4. 重命名 — 在变量/函数上按 L,让名称更清晰
  5. 交叉引用 — 在函数/数据上按 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