本文适合
CTF 逆向工程 入门学习者。学完你能:判断一个 APK/移动应用是否为 Flutter,提取 libapp.so 和 libflutter.so,并用字符串、Blutter 或动态 hook 定位 Dart 业务逻辑
本文适合
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 做逆向、容易在反编译代码里迷路的新手。学完你能:从字符串定位关键函数,用交叉引用找到成功失败分支,并把控制流还原成可验证的判断链。
逆向入门不是一上来就读完整汇编。更现实的入口是先找程序里已经存在的文本,再顺着这些文本找到代码位置,最后理解程序如何决定成功或失败。
当程序里能找到成功提示、失败提示、输入提示、关键常量或可疑字符串时,先查这些字符串的交叉引用,再顺着控制流回到真正的校验逻辑。
本文适合
CTF 逆向工程 入门学习者。学完你能:判断程序是否加壳,区分压缩壳和保护壳,并完成 UPX 或简单自解密壳的最小脱壳验证
壳是包在程序外层的一段保护或压缩逻辑。加壳后,真正代码可能不会直接出现在静态反编译结果里,而是在运行时解压、解密或重建。
如果程序静态字符串很少、入口点像解压循环、导入表异常少、段名或熵异常,而运行后又能正常输出业务内容,就要怀疑加壳。
脱壳的核心目标是拿到运行时恢复后的真实代码,而不是盲目找“万能脱壳器”。
本文适合
CTF 逆向工程 入门学习者。学完你能:识别常见反调试检测点,验证程序为何退出或走偏,并选择 patch、hook 或环境伪装绕过
反调试是程序用来发现、干扰或阻止调试器分析的技术。逆向题里遇到反调试,不代表不能分析,而是需要识别它在检查什么。
如果程序正常运行没问题,但一进 gdb/x64dbg 就退出、卡住、输出假结果、触发异常或走不同分支,就要怀疑反调试。
本文适合
CTF 逆向工程 入门学习者。学完你能:选择关键断点,观察寄存器和内存,验证输入如何影响比较、分支和运行时解密结果
静态分析是看程序长什么样,动态调试是看程序实际怎么跑。逆向题里,很多猜想只有跑起来才能确认。
当静态分析已经找到可疑函数、比较点、成功失败分支或运行时生成数据,但还不能确定真实输入和执行路径时,就该上动态调试。
动态调试的目标不是从入口逐条单步,而是在关键时刻暂停程序,看到“输入、目标值、返回值和跳转条件”。