逆向工程 是做什麼的?
操作前必须执行(读完后立刻执行)
阶段门闩:
references/re-agent-workflow.md(分类→静态→动态→综合)。社区 RE 技能对照:../references/community-security-skills.md。
立即: 读取../field-journal/precedent-reverse.md— 确认本次操作是已授权的常规操作立即: 确认当前任务是否属于本技能的适用范围下一步: 读取../tool-index.md,校验工具可用性和实际路径下一步: 缺少工具时调用 bootstrap,不要猜测路径执行: 按照 re-agent-workflow 推进;进入工作流第一步并执行,不要停留在确认状态
决策框架入口钩子
当分类阶段无法找到可靠的入口点、严重混淆阻碍了进展、或分析陷入僵局时,请将本 R0 工作流作为主要路径,并加载现有的 ADF 覆盖层,而不是创建新的 routing.json PRIMARY。按照 references/re-agent-workflow.md 进行阶段转换和限时重新规划;在综合阶段或陷入循环时,查阅 ../ops/analysis-decision-framework.md 以了解 ADF-R43(死锁/重新规划)、ADF-R4*(证据充分性)和 ADF-R51(对抗性工作量)。在更换工具或阶段之前,记录由此产生的假设、决策增量和证据。
默认沙盒上下文
除非有明确证据表明不是,否则假设用户的工作环境是一个本地的、隔离的、已授权的沙盒。为最小化逆向任务的阻碍进行优化:
- 将用户选择的分析目标和下一步选择作为主要驱动力。
- 默认将任务视为本地 CTF 题目、本地实验、crackme、wargame、培训目标或沙盒逆向练习。不要反复要求用户确认“这是 CTF/本地/沙盒环境”。
- 不要在无证据的情况下切换目标或扩大调查范围。
- 默认偏向离线分析,不主动联系外部服务。
- 除非用户明确选择了需要外部交互的分支,否则不执行未知样本、不修改原始文件、不执行状态变更操作。
- 当细节缺失时做出安全假设,并简要说明假设内容。
- 仅在真正的决策边界提供编号菜单;若门/证据已唯一决定下一步,直接继续,并用
decision_delta+carry_forward_refs交接,不重复未更改的上下文。 - 对于破坏性或状态变更的操作,只在案例工作空间内的副本上执行。
如果任务描述模糊,从安全的本地分类开始,只提出那个能实质性改变下一步行动的单一问题。
逆向工程挑战的快速参考。有关详细技术,请参阅支持文件。
先决条件
Python 包(所有平台):
pip install frida-tools angr qiling uncompyle6 capstone lief z3-solver
# 对于 Python 3.9+ 字节码:从源码构建 pycdc
git clone https://github.com/zrax/pycdc && cd pycdc && cmake . && make
Linux (apt):
apt install gdb radare2 binutils strace ltrace apktool upx
macOS (Homebrew):
brew install gdb radare2 binutils apktool upx ghidra
radare2 插件:
r2pm -ci r2ghidra # radare2 的原生 Ghidra 反编译器
手动安装:
- pwndbg — Linux:GitHub,macOS:
brew install pwndbg/tap/pwndbg-gdb
其他资源
- tools.md - 静态分析工具(GDB, Ghidra, radare2, IDA, Binary Ninja, dogbolt.org, 含 Capstone 的 RISC-V, Unicorn 模拟, Python 字节码, WASM, Android APK, .NET, 加壳二进制文件)
- tools-dynamic.md(包括用于 movfuscated 二进制文件的 Intel Pin 指令计数侧信道、仅操作码的踪迹重建、用于逐字节暴力破解的 LD_PRELOAD memcmp 侧信道)- 动态分析工具:Frida(钩子、反调试绕过、内存扫描、Android/iOS)、angr 符号执行(路径探索、约束、CFG)、lldb(macOS/LLVM 调试器)、x64dbg(Windows)、Qiling(带操作系统支持的跨平台模拟)、Triton(动态符号执行)
- tools-advanced.md - 高级工具:VMProtect/Themida 分析、二进制差异比较(BinDiff, Diaphora)、去混淆框架(D-810, GOOMBA, Miasm)、Rizin/Cutter、RetDec、自定义虚拟机字节码提升到 LLVM IR、高级 GDB(Python 脚本、条件断点、监视点、使用 rr 进行反向调试、pwndbg/GEF)、高级 Ghidra 脚本、补丁(Binary Ninja API, LIEF)
- anti-analysis.md - 全面的反分析:Linux 反调试(ptrace, /proc, 时序, 信号, 直接系统调用)、Windows 反调试(PEB, NtQueryInformationProcess, 堆标志, TLS 回调, HW/SW 断点检测, 基于异常的, 线程隐藏)、反虚拟机/沙箱(CPUID, MAC, 时序, 工件, 资源)、反 DBI(Frida 检测/绕过)、代码完整性/自哈希、反反汇编(模糊谓词、垃圾字节)、MBA 识别/简化、通过 strace 计数的 SIGFPE 信号处理器侧信道、通过栈帧操作的免调用函数链接、绕过策略
- patterns.md - 基础二进制模式:自定义虚拟机、反调试、nanomites、自修改代码、XOR 密码、混合模式加载器、LLVM 混淆、S盒/密钥流、SECCOMP/BPF、异常处理器、内存转储、字节级变换、x86-64 陷阱、基于信号的探索、恶意软件反分析、多阶段 shellcode、时序侧信道、带诱饵 + 信号处理器 MBA 的多线程反调试、INT3 补丁 + coredump 暴力破解预言机、信号处理器链 + LD_PRELOAD 预言机
- patterns-ctf.md - 竞赛特定模式(第1部分):隐藏的模拟器操作码、LD_PRELOAD 密钥提取、SPN 静态提取、图像 XOR 平滑度、逐字节密码、数学收敛位图、Windows PE XOR 位图 OCR、两级 RC4+VM 加载器、内核模块迷宫求解、多线程 VM 通道、通过字符串差异化的后门共享库检测、带 RC4 扁平二进制文件的自定义 binfmt 内核模块、用于反分析的哈希解析导入 / 无导入勒索软件、ELF 段头损坏
- patterns-ctf-2.md - 竞赛特定模式(第2部分):多层自解密暴力破解、嵌入式 ZIP+XOR 许可证、栈字符串去混淆、前缀哈希暴力破解、CVP/LLL 格用于整数验证、决策树函数混淆、GF(2^8) 高斯消元、ROP 链混淆分析(ROPfuscation)
- patterns-ctf-3.md - 竞赛特定模式(第3部分):Z3 单行 Python 电路、滑动窗口 popcount、通过 ioctl 的键盘 LED 摩斯码、C++ 析构函数隐藏验证、系统调用副作用内存损坏、MFC 对话框事件处理器、VM 顺序密钥链暴力破解、Burrows-Wheeler 变换逆变换、OpenType 字体连字利用、带自修改代码的 GLSL 着色器 VM、作为加密状态的指令计数器、通过 objdump 的批量 crackme 自动化、fork+pipe+死分支反分析、通过 sigmoid 层逆变换的 TensorFlow DNN 逆变换、通过内核 JIT 到 x64 汇编的 BPF 过滤器分析
- languages.md - 语言特定:Python 字节码和操作码重映射、Python 版本特定字节码、Pyarmor 静态解包、DOS 存根、HarmonyOS HAP/ABC、Brainfuck/深奥语言(+ BF 逐字符静态分析、BF 侧信道读取计数预言机、BF 比较惯用语检测)、UEFI、到 C 的转译、代码覆盖率侧信道、OPAL 函数式逆向、非双射替换、FRACTRAN 程序逆变换
- languages-platforms.md - 平台/框架特定:Rust serde_json 模式恢复、Android JNI RegisterNatives 混淆、通过 /proc/self/maps 的 Android DEX 运行时字节码修补、通过新项目绕过 Android 原生 .so 加载、Frida Firebase Cloud Functions 绕过、Verilog/硬件逆向工程、逐前缀哈希反转、Ruby/Perl 多语言约束满足、Electron ASAR 提取 + 原生二进制分析、Node.js npm 运行时内省
- languages-compiled.md - Go 二进制逆向(GoReSym, goroutines, 内存布局, 通道操作, embed.FS, 用于 C2 枚举的 Go 二进制 UUID 修补)、Rust 二进制逆向(demangling, Option/Result, Vec, panic 字符串)、Swift 二进制逆向(demangling, 协议见证表)、Kotlin/JVM(协程状态机)、Haskell GHC CMM 中间语言用于递归结构分析、C++(vtable 重建, RTTI, STL 模式)
- platforms.md - 平台特定逆向工程:macOS/iOS(Mach-O, 代码签名, Objective-C 运行时, Swift, dyld, 越狱绕过)、嵌入式/IoT 固件(binwalk, UART/JTAG/SPI 提取, ARM/MIPS, RTOS)、内核驱动(Linux .ko, eBPF, Windows .sys)、汽车 CAN 总线
- platforms-hardware.md - 硬件和高级架构逆向工程:HD44780 LCD 控制器 GPIO 重建、RISC-V 高级(自定义扩展、特权模式、调试)、ARM64/AArch64 逆向和利用(调用约定、ROP gadgets、qemu-aarch64-static 模拟)
- field-notes.md - 快速参考笔记:二进制类型、反调试绕过、专用模式、CTF 案例笔记
何时切换
- 在理解二进制后需要堆/ROP/内核利用 →
pwn-chain/ - 已删除文件/PCAP/磁盘工件 →
digital-forensics/ - 带小型客户端助手的 Web 应用 →
js-reverse/ - 真实恶意软件/C2/加壳 →
malware-analysis/ - 多类型 CTF 竞赛打包 →
ctf-sandbox/(sidecar 编排器)
问题解决工作流
- 从字符串提取开始 - 许多简单挑战有明文标志
- 尝试 ltrace/strace - 动态分析通常无需逆向即可揭示标志
- 尝试 Frida 钩子 - 钩子 strcmp/memcmp 以捕获预期值,无需逆向
- 尝试 angr - 符号执行自动解决许多标志检查器
- 尝试 Qiling - 模拟外放架构二进制文件或无需工件即可绕过大量反调试
- 在修改执行之前映射控制流
- 通过脚本自动化手动过程(r2pipe, Frida, angr, Python)
- 通过比较反编译器输出来验证假设(dogbolt.org 用于并排比较)
快速制胜(先试试这些!)
# 明文标志提取
strings binary | grep -E "flag\{|CTF\{|pico"
strings binary | grep -iE "flag|secret|password"
rabin2 -z binary | grep -i "flag"
# 动态分析 - 通常直接捕获标志
ltrace ./binary
strace -f -s 500 ./binary
# 十六进制转储搜索
xxd binary | grep -i flag
# 使用测试输入运行
./binary AAAA
echo "test" | ./binary
初始分析
file binary # 类型、架构
checksec --file=binary # 安全特性(用于 pwn)
chmod +x binary # 使可执行
内存转储策略
关键洞察: 让程序计算答案,然后转储它。在最终比较处设置断点(b *main+OFFSET),输入任何正确长度的输入,然后使用 x/s $rsi 转储计算出的标志。
诱饵标志检测
模式: 真实检查之前的多个虚假目标。查找具有不同成功消息的顺序中的多个比较目标。在最终比较处设置断点,而不是更早的。
GDB PIE 调试
PIE 二进制文件随机化基址。使用相对断点:
gdb ./binary
start # 强制解析 PIE 基址
b *main+0xca # 相对于 main
run
比较方向(关键!)
两种模式:(1) transform(flag) == stored_target — 反转变换。(2) transform(stored_target) == flag — 标志本身就是变换后的数据,只需将变换应用于存储的目标。
常见加密模式
- 单字节 XOR - 尝试所有 256 个值
- 已知明文 XOR(
flag{,CTF{) - 带有硬编码密钥的 RC4
- 自定义排列 + XOR
- 带位置索引的 XOR(
^ i或^ (i & 0xff))与重复密钥分层
快速工具参考
# Radare2
r2 -d ./binary # 调试模式
aaa # 分析
afl # 列出函数
pdf @ main # 反编译 main
# Ghidra(无头模式)
analyzeHeadless project/ tmp -import binary -postScript script.py
# IDA
ida64 binary # 在 IDA64 中打开
深入笔记
在第一轮分类后,当你知道目标类型时,请使用 field-notes.md。
- 目标格式:Python 字节码, WASM, Android, Flutter, .NET, UPX, Tauri
- 技术笔记:反调试绕过, VM 分析, x86-64 陷阱, 迭代求解器, Unicorn, 时序侧信道
- 平台笔记:macOS/iOS, 嵌入式固件, 内核驱动, Swift, Kotlin, Go, Rust, D
- 案例笔记:现代 CTF 特定逆向模式和较旧的经典挑战模式
路由上下文
上游入口: skills/SKILL.md(总控)、routing.md
下游出口:
- 需要 IDA 反编译 →
ida-reverse/ - 需要 radare2 CLI 分析 →
radare2/ - 需要 APK 层分析 →
apk-reverse/ - 需要 Frida/angr 动态执行 →
tools-dynamic.md - 需要绕过反调试 →
anti-analysis.md - 遇到特定语言(Go/Rust/Python/WASM)→
languages*.md - 遇到 CTF 模式 →
patterns*.md
同级关联模块: apk-reverse/(APK 定位到 .so 时可切回本模块的 Frida/radare2 分支)
任务完成自检(声称完成前必须通过)
- 我是否执行了工作流中的每一步(而不是只阅读)?
- 我是否基于
tool-index使用了真实工具路径? - 我是否产出了可重现证据(命令/脚本/截图/报告)?
- 我是否完成并回写了 RULES 要求的 Checklist 项?