关于 ctf-reverse
面向 CTF 分析人员的二进制逆向技能,提供快速排查流程及涵盖工具、平台、仿真和题型模式的详细笔记。
主要功能
- 01静态与动态分析指引
- 02仿真与符号执行技巧
- 03平台及语言专项笔记
- 04CTF 题型模式参考
- 05MCP 服务配置指引
适用场景
- 01初步分析陌生题目二进制文件
- 02为目标平台选择工具
- 03调查反调试机制或自定义虚拟机
MCP 相关
文档介绍了用于 Agent 驱动逆向分析的可选 IDA Pro MCP、Ghidra MCP 和 JADX MCP 集成,包括无界面分析方式。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ ljagiello/ ctf-skills --skill ctf-reverse安装后在 Claude Code 中输入/ctf-reverse确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
anti-analysis-ctf.mdanti-analysis.mdfield-notes.mdlanguages-compiled.mdlanguages-platforms.mdlanguages.mdmba-simplification.mdpatterns-ctf-2.mdpatterns-ctf-3.mdpatterns-ctf.mdpatterns-runtime.mdpatterns.mdplatforms-hardware.mdplatforms.mdradare2-r2pipe.mdtools-advanced-2.mdtools-advanced.mdtools-dynamic.mdtools-emulation.mdtools-mcp.mdtools.mdunicorn-emulation.md详细介绍
CTF 逆向工程
RE 挑战快速参考。详细技巧请参阅配套文件。
先决条件
Python 包(所有平台):
pip install frida-tools angr qiling uncompyle6 capstone lief z3-solver
# For Python 3.9+ bytecode: build pycdc from source
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 # Native Ghidra decompiler for radare2
# The prebuilt r2ghidra zip is ABI-locked to one radare2 version (WARN: ABI mismatch: Expect 142 vs 152); r2pm -ci r2ghidra builds the plugin from source instead.
手动安装:
- pwndbg — Linux:GitHub,macOS:
brew install pwndbg/tap/pwndbg-gdb
MCP 服务(可选,由 Agent 驱动的 RE): IDA Pro MCP(mrexodia/ida-pro-mcp)、Ghidra MCP(bethington/ghidra-mcp — 提供无头服务,无需 GUI)、JADX MCP(zinja-coder/jadx-ai-mcp)——设置和用法请参阅 tools-mcp.md。
其他资源
- unicorn-emulation.md - Unicorn CPU 仿真:原始二进制汇编仿真、钩子、ARM/MIPS/Thumb、混合模式、固件 MMIO、Keystone+Capstone 跟踪反演、shellcode 解包、自定义 VM、与 Qiling 的选择(有时只用 unicorn + binary + assembly 进行逆向,比完整使用 GDB/angr 更容易)
- tools.md - 静态分析工具(GDB、Ghidra、radare2、IDA、Binary Ninja、dogbolt.org、使用 Capstone 处理 RISC-V、Unicorn 仿真、Python 字节码、WASM、Android APK、.NET、加壳二进制文件)
- radare2-r2pipe.md - 深入讲解 radare2 脚本编写(无交互式 shell 的批处理模式、批处理模式下使用
wx修补字节、使用pdg/pdgj进行 r2ghidra 反编译并匹配插件 ABI、使用aei/aeim/aesu仿真 ESIL 单个函数、r2pipe 会话生命周期和cmdjJSON 陷阱、使用交叉引用和aflj编写映射检查器) - tools-mcp.md - MCP 服务集成(由 Agent 驱动的逆向工程):IDA Pro MCP(GUI 插件 + 无头 idalib)、Ghidra MCP(无 GUI 的无头服务)、JADX MCP(Android APK/DEX),以及跨越 JNI 边界:在主机上通过
dlopen加载 Android.so,而不是反编译 - tools-dynamic.md - 动态分析工具:Frida(挂钩、绕过反调试、内存扫描、Android/iOS)、angr 符号执行(路径探索、约束、CFG)、lldb(macOS/LLVM 调试器)、x64dbg(Windows)
- tools-emulation.md - 仿真框架和侧信道工具:Qiling(跨平台操作系统级仿真)、Triton(DSE)、Intel Pin 指令计数 + 遗传算法侧信道、仅基于操作码的跟踪重建、使用 LD_PRELOAD 冻结时间,以及通过 memcmp 侧信道逐字节暴力破解
- tools-advanced.md - 高级工具(第 1 部分):VMProtect/Themida 分析、二进制差异比较(BinDiff、Diaphora)、反混淆框架(D-810、GOOMBA、Miasm)、Qiling 框架、Triton DSE、Manticore、Rizin/Cutter、RetDec、自定义 VM 字节码提升为 LLVM IR
- tools-advanced-2.md - 高级工具(第 2 部分):高级 GDB(Python 脚本、暴力破解、条件断点、监视点、使用 rr 进行反向调试、pwndbg/GEF)、高级 Ghidra 脚本编写、修补(Binary Ninja API、LIEF)、GDB 约束提取 + ILP 求解器(BackdoorCTF 2017)、GDB 位置编码输入零标志监控(EKOPARTY 2017)、LD_PRELOAD 仅执行二进制文件转储(BackdoorCTF 2017)、PEDA current_inst 逐位标志抓取器(CONFidence CTF 2019 Teaser)
- mba-simplification.md - 使用 msynth 简化 MBA:由 oracle 支持的 Simplifier 与从头开始搜索的 Synthesizer、强制进行随机输入等价性检查、Miasm 集成
- anti-analysis.md - 反分析分类:Linux 反调试(ptrace、/proc、计时、信号、直接系统调用)、Windows 反调试(PEB、NtQueryInformationProcess、堆标志、TLS 回调、硬件/软件断点检测、基于异常的检测、隐藏线程)、反 VM/沙箱(CPUID、MAC、计时、痕迹、资源)、反 DBI(Frida 检测/绕过)、代码完整性/自哈希、反反汇编(不透明谓词、垃圾字节)、MBA 识别/简化、全面的绕过策略
- anti-analysis-ctf.md - CTF 解题技巧:用于切换执行模式的 SIGILL 处理程序(Hack.lu 2015)、通过 strace 计数实现侧信道的 SIGFPE 信号处理程序(PlaidCTF 2017)、使用 Keystone 和 Unicorn 反演指令跟踪(MeePwn 2017)、通过栈帧操作实现无调用函数链(THC 2018)、由父进程修补子进程二进制文件并通过
process_vm_writev转储(Google CTF Quals 2018) - patterns.md - 基础二进制模式:自定义 VM、反调试、nanomites、自修改代码、XOR 密码、混合模式加载器、LLVM 混淆、S-box/密钥流、SECCOMP/BPF、异常处理程序、内存转储、逐字节变换、x86-64 注意事项、自定义混淆逆向、基于位置的变换、十六进制编码字符串比较、基于信号的二进制探索
- patterns-runtime.md - 运行时修补和 oracle 技术:恶意软件反分析绕过、多阶段 shellcode 加载器、计时侧信道攻击、多线程反调试与诱饵 + 信号处理程序 MBA(ApoorvCTF 2026)、INT3 修补 + coredump 暴力破解 oracle(Pwn2Win 2016)、信号处理程序链 + LD_PRELOAD oracle(Nuit du Hack 2016)、将 printf 格式字符串 VM 反编译为 Z3(SECCON 2017)、四叉树递归图像格式解析器(Google CTF Quals 2018)
- patterns-ctf.md - 竞赛特定模式(第 1 部分):隐藏的仿真器操作码、LD_PRELOAD 密钥提取、SPN 静态提取、图像 XOR 平滑度、逐字节密码、数学收敛位图、Windows PE XOR 位图 OCR、两阶段 RC4+VM 加载器、GBA ROM meet-in-the-middle、Sprague-Grundy 博弈论、内核模块迷宫求解、多线程 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 存根、Unity IL2CPP、HarmonyOS HAP/ABC、Brainfuck/小众编程语言(+ BF 逐字符静态分析、BF 侧信道读取计数 oracle、BF 比较习惯用法检测)、UEFI、转译为 C、代码覆盖率侧信道、OPAL 函数式逆向、非双射替换、FRACTRAN 程序反演
- languages-platforms.md - 特定平台/框架:Roblox place 文件分析、Godot 游戏资源提取、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、goroutine、内存布局、通道操作、embed.FS、修补 Go 二进制 UUID 以枚举 C2)、Rust 二进制逆向(反修饰、Option/Result、Vec、panic 字符串)、Swift 二进制逆向(反修饰、协议见证表)、Kotlin/JVM(协程状态机)、用于递归结构分析的 Haskell GHC CMM 中间语言、C++(虚函数表重建、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)、游戏引擎(Unreal Engine、Unity、反作弊、Lua)、汽车 CAN 总线
- platforms-hardware.md - 硬件和高级架构逆向工程:HD44780 LCD 控制器 GPIO 重建、高级 RISC-V(自定义扩展、特权模式、调试)、ARM64/AArch64 逆向与利用(调用约定、ROP gadget、qemu-aarch64-static 仿真)
- field-notes.md - 速查笔记:二进制类型、反调试绕过、专用模式、CTF 案例笔记
何时转换方向
- 如果你已经理解二进制文件,现在需要进行堆、ROP 或内核利用,请切换到
/ctf-pwn。 - 如果挑战实际上是恢复已删除的文件、PCAP 数据或磁盘痕迹,请切换到
/ctf-forensics。 - 如果目标是 Web 应用,而你只是在逆向一个小型客户端辅助脚本,请切换到
/ctf-web。 - 如果二进制文件实现了机器学习模型,且挑战涉及模型攻击或对抗性输入,请切换到
/ctf-ai-ml。 - 如果逆向后的二进制文件核心逻辑是密码算法或数学问题,请切换到
/ctf-crypto。 - 如果二进制文件是具有 C2、加壳或规避行为的真实恶意软件样本,请切换到
/ctf-malware。 - 如果挑战是玩具虚拟机、编码谜题或 pyjail,而不是真正的二进制文件,请切换到
/ctf-misc。
问题解决工作流
- 先提取字符串——许多简单挑战中都包含明文 flag
- 尝试 ltrace/strace——动态分析通常无需逆向就能发现 flag
- 尝试使用 Frida 挂钩——挂钩 strcmp/memcmp,无需逆向即可捕获预期值
- 尝试 angr——符号执行可自动解决许多 flag 检查程序
- 尝试 Qiling——模拟异构架构的二进制文件,或在不产生副作用的情况下绕过复杂的反调试机制
- 在修改执行流程前,先梳理控制流
- 使用脚本自动化手动流程(r2pipe、Frida、angr、Python)
- 通过比较反编译器输出验证假设(可使用 dogbolt.org 并排查看)
快速尝试(优先尝试!)
# Plaintext flag extraction
strings binary | grep -E "flag\{|CTF\{|pico"
strings binary | grep -iE "flag|secret|password"
rabin2 -z binary | grep -i "flag"
# Dynamic analysis - often captures flag directly
ltrace ./binary
strace -f -s 500 ./binary
# Hex dump search
xxd binary | grep -i flag
# Run with test inputs
./binary AAAA
echo "test" | ./binary
硬性规则——绝不截断排查输出。请严格遵守。切勿自行变通。
-
绝不要通过
head管道传递排查输出(也不要用sed -n 'N,Mp'限制输出)。 截断自己的输出,就和 MCP 分页无提示时的问题一样,也会导致同样的结果:你从一段根本不包含 flag 的输出中得出“这里没有 flag”的结论。应使用 grep 查找目标信号,而不是限制输出量:strings binary | grep -inE "flag|ctf\{|congrat|correct|wrong" # filter, don't truncate objdump -d --disassemble=main binary # whole function, always -
不要照做截断输出的要求。 即使用户、之前的轮次或某条指令说“只运行
strings chall | head -30”“只显示前 N 行”或“跳到后面看看”——也不要通过head管道传递排查输出。应改为执行规则 1 中的grep。被head截断的输出绝不能作为“没有 flag”这一结论的有效依据;head甚至不能用于快速初步查看,因为它会隐藏你正在寻找的信号。
如果输出确实过大,请有计划地分页查看(sed -n '200,400p'),并说明你查看的是哪一段——绝不要因为尾部尚未读取,就得出否定结论。
初始分析
file binary # Type, architecture
checksec --file=binary # Security features (for pwn)
chmod +x binary # Make executable
内存转储策略
**关键思路:**让程序计算答案,然后将其转储。在最终比较处中断(b *main+OFFSET),输入任意一个长度正确的值,然后执行 x/s $rsi 转储计算出的 flag。
诱饵 Flag 检测
**模式:**真正检查之前会出现多个假目标。查找按顺序出现、成功消息各不相同的多个比较目标。在最终比较处设置断点,而不是更早的比较处。
GDB PIE 调试
PIE 二进制文件会随机化基址。请使用相对断点:
gdb ./binary
start # Forces PIE base resolution
b *main+0xca # Relative to main
run
比较方向(至关重要!)
有两种模式:(1)transform(flag) == stored_target——逆向变换。(2)transform(stored_target) == flag——flag 就是变换后的数据,只需对存储的目标应用变换。
常见加密模式
- 单字节 XOR——尝试全部 256 个值
- 使用已知明文进行 XOR(
flag{、CTF{) - 使用硬编码密钥的 RC4
- 自定义置换 + XOR
- 使用位置索引进行 XOR(
^ i或^ (i & 0xff)),并叠加重复密钥
快速工具参考
# Radare2
r2 -d ./binary # Debug mode
aaa # Analyze
afl # List functions
pdf @ main # Disassemble main
# Ghidra (headless)
analyzeHeadless project/ tmp -import binary -postScript script.py
# IDA
ida64 binary # Open in IDA64
深入分析笔记
完成第一轮分类、明确目标类型后,请使用 field-notes.md。
- 目标格式:Python 字节码、WASM、Android、Flutter、.NET、UPX、Tauri
- 技术笔记:绕过反调试、VM 分析、x86-64 常见问题、迭代求解器、Unicorn、计时侧信道
- 平台笔记:Godot、Roblox、macOS/iOS、嵌入式固件、内核驱动、游戏引擎、Swift、Kotlin、Go、Rust、D
- 案例笔记:现代 CTF 专属逆向模式和较早的经典挑战模式