本文适合
熟悉 字符串、交叉引用与控制流,并做过基础前端题的逆向学习者。学完你能:从网页中定位 .wasm,分析导入导出表和线性内存,复现或逆向 Wasm 中的校验逻辑
本文适合
熟悉 字符串、交叉引用与控制流,并做过基础前端题的逆向学习者。学完你能:从网页中定位 .wasm,分析导入导出表和线性内存,复现或逆向 Wasm 中的校验逻辑
本文适合
已经能读普通校验逻辑,但遇到自定义 opcode、解释器循环和字节码数组时不知道从哪里下手的学习者。学完你能:识别 VM 解释器,提取字节码,建立 opcode 语义表,并写反汇编器或模拟器还原校验逻辑。
VM 逆向题会把原本直接执行的逻辑转换成自定义字节码,再由解释器执行。分析重点从“读机器指令”变成“理解这个虚拟机的指令集和状态机”。
如果程序有一段字节码数组、一个指令指针、一个分发循环,并根据 opcode 执行不同处理器,就要按自定义 VM 题分析。
本文适合
拿到 .pyc、PyInstaller 打包程序、exec/marshal 混淆脚本后,不知道如何恢复 Python 逻辑的学习者。学完你能:判断 Python 字节码版本,修复/反编译 pyc,读取 code object 常量和字节码,并在反编译失败时用 dis 和动态 dump 还原校验链。
Python 程序可以被编译成 .pyc 字节码文件。CTF 中常见任务是从 .pyc、打包程序或混淆字节码中恢复源码逻辑。
本文适合
已经能用 jadx 看 APK Java 层、但遇到 native 方法和 .so 校验逻辑会卡住的学习者。学完你能:判断 JNI 静态/动态注册方式,定位 Java 方法对应的 native 函数,并用静态分析或 Frida 验证参数和返回值。
JNI 是 Java Native Interface,用来让 Java 或 Kotlin 代码调用 native C/C++ 代码。APK 逆向中,关键校验逻辑常常通过 JNI 藏到 .so 文件里。
本文适合
已经能做普通 C/C++ 逆向,但遇到 Go/Rust 大体积二进制、运行时代码和符号名时容易迷路的学习者。学完你能:识别 Go/Rust 二进制特征,过滤运行时代码,定位 main/业务函数,并用语言特有字符串、panic 和符号信息推进分析。
Go 和 Rust 编译出的二进制常常比传统 C 程序更大,运行时结构也更复杂。识别语言特征能帮助你少走弯路。
如果二进制体积很大、符号或字符串里出现 runtime.、main.main、go1.、Rust mangled name、panicked at、Option::unwrap,就要按 Go/Rust 语言运行时特征来分析。
本文适合
CTF 逆向工程 入门学习者。学完你能:判断一个 APK/移动应用是否为 Flutter,提取 libapp.so 和 libflutter.so,并用字符串、Blutter 或动态 hook 定位 Dart 业务逻辑
本文适合
CTF 逆向工程 入门学习者。学完你能:判断程序是否为 .NET,使用 dnSpy/ILSpy 从类、方法、资源和事件处理函数定位校验逻辑,并完成源码级或 IL 级验证
.NET 程序通常编译成中间语言 IL,并保留大量元数据。相比原生 C/C++ 程序,很多 .NET 题更接近“高层代码恢复”。
如果 PE 文件带 CLR/.NET 元数据,或 dnSpy/ILSpy 能直接恢复类、方法和 C# 代码,就按 .NET 逆向处理,优先看字符串、资源和事件处理函数。
本文适合
CTF 逆向工程 入门学习者。学完你能:拆解 APK 结构,定位 Manifest、Java/Kotlin、资源和 native so 中的校验入口,并完成一次最小验证
APK 是 Android 应用安装包。它本质上是一个压缩包,里面包含代码、资源、配置、签名和可能的 native 库。
拿到 .apk 时,不要先当普通 exe 看;先把它当压缩包和 Android 工程拆开,按 Manifest、dex、资源、assets、native so 五条线定位校验逻辑。
本文适合
刚开始用 IDA/Ghidra 做逆向、容易在反编译代码里迷路的新手。学完你能:从字符串定位关键函数,用交叉引用找到成功失败分支,并把控制流还原成可验证的判断链。
逆向入门不是一上来就读完整汇编。更现实的入口是先找程序里已经存在的文本,再顺着这些文本找到代码位置,最后理解程序如何决定成功或失败。
当程序里能找到成功提示、失败提示、输入提示、关键常量或可疑字符串时,先查这些字符串的交叉引用,再顺着控制流回到真正的校验逻辑。