CTF逆向Re:零基础系统性入门教程-3-解题流程
目录
前言
或许初学者对如何入手一道题目十分迷茫,初学者通常会经历这样的阶段,但是如果你已经对前两的教程内容已经过关,那么你就具备解逆向题的能力了,是的,要相信自己。
这里推荐一些可以训练的平台(参考自快速开始 - Hello CTF)。个人最常用的是第一个平台NSSCTF,因为其丰富的筛选机制和简洁明了的题目类型,能让你快速掌握某一类题目。当你完成特定标签的题目并进行分类研究复盘时,这类题目的解题能力将显著提升。建议初学者优先选择已掌握编程语言的题目进行练习。
- NSSCTF https://www.nssctf.cn/index
- BUUCTF https://buuoj.cn/
- CTFshow https://ctf.show/
- 攻防世界 https://adworld.xctf.org.cn/home/index
- 青少年 CTF https://www.qsnctf.com/
- CTFhub https://www.ctfhub.com/#/index
- Bugku https://ctf.bugku.com/
第三章:解题流程和常见考点
以下是我根据经验总结的一张解题流程图,当然,不能涵盖100%的情况,但仍可以做一个参考。
接下来我们将逐步讲解每个环节。虽然内容较多,初学者可能一时难以完全掌握,但不必担心。大家只需先了解整体流程,对各个知识点有初步认识即可,后续我们会针对每个知识点展开详细讲解。
1. 判断文件类型
- 作用:逆向分析的起点,确定目标文件的格式如 ELF(linux)、PE(Windows)、Python 字节码、方舟字节码等等。为后续选择系统和工具提供依据。
- 操作:用
file命令或工具识别文件类型。如果熟练的话,可以直接通过观察法。不过值得注意的是,有些题会改文件后缀,因此眼见不一定为实。 - 提示:一般文件名和题目简介会包含很多信息,因此要特别关注。
2. 静态分析
逆向最关键的步骤之一,在不运行程序的前提下,通过反编译工具(如 IDA、Ghidra)分析代码逻辑,定位关键信息(如 flag、加密算法、验证逻辑)。
- 初步分析:判断文件是否被保护(加壳、花指令、反调试),从而规划后续处理路径。
3. 脱壳,修复函数
- 脱壳:移除程序的 “壳”(保护层),还原原始代码。
- 用
upx -d 文件名脱 UPX 壳; - 有些魔改壳不能用程序脱壳,只能手动调试找 OEP(程序入口点)脱自定义壳。
- 脱壳后,代码可能因壳的干扰出现结构混乱(如函数调用关系断裂、指令残缺),需手动或工具辅助修复函数结构、指令序列,使程序逻辑可被静态分析工具识别。
- 用
- 花指令:观察反汇编代码的 “逻辑断裂”:如无意义的重复跳转、指令与函数功能不匹配,在IDA中通常会显示为红色。
- 反调试:
- 系统调用检测:如 Linux 下
ptrace调用(程序检测自身是否被调试);Windows 下IsDebuggerPresent函数。 - 时间差检测:程序在关键逻辑前后获取时间戳,若差值过大则判定为调试环境。
- 调试器特征检测:如检查调试器的内存段、寄存器特征。
- 系统调用检测:如 Linux 下
4. 厘清逻辑
- 作用:通过反编译工具(如 IDA、Ghidra)梳理代码逻辑,定位关键信息(如 flag 位置、加密算法、验证逻辑)。
- 分支 1:直接显示 → 解出 flag。
- 说明:静态分析中直接找到 flag,例如程序包含明文 flag(如
char flag[] = "flag{xxx}"),或通过字符串搜索(如 IDA 中Shift+F12搜索 “flag”)直接定位。
- 说明:静态分析中直接找到 flag,例如程序包含明文 flag(如
- 分支 2:加密 → 解密,写脚本。
- 说明:发现代码中存在加密逻辑(如 XOR、AES、Base64 等),需逆向加密算法,编写脚本解密得到 flag。
- 分支 3:受阻 → 动态调试。
- 说明:静态分析无法理清逻辑(如存在动态生成的代码、运行时才初始化的变量),需通过运行程序跟踪流程。
5. 动态调试
- 作用:运行程序并通过调试工具(IDA动态调试,x64dbg,gdb)跟踪执行流程,观察寄存器、内存、变量的实时变化。
- 操作:在关键函数(如验证函数、加密函数)处下断点,单步执行(F8),查看输入的加密过程、变量的校验逻辑,最终 “找到变量”,进而解出 flag。
6. 解密,写脚本
- 作用:针对静态分析中识别的加密算法,逆向编写解密脚本,还原明文 flag。
- 示例:若程序用 “输入 XOR 0x12 == 密文” 的逻辑,可写 Python 脚本
flag = bytes([c ^ 0x12 for c in 密文])还原明文。
7. 解出 flag
- 最终目标:通过静态分析直接找到、动态调试跟踪变量,或解密脚本运行后,得到 CTF 题目的 flag,完成逆向任务。
如果没有理解没关系,后续我会逐步讲解其中重难点。现在我们直接通过一道签到题来将完整的流程体会一下。
解题演示
这是一道从NSSCTF中下载的签到题
1.判断文件类型
观察到文件没有后缀,拖入DIE中发现文件操作系统为Ubuntu Linux,C语言,无壳。而且文件名为easybase,因此推断是base系列加密。
2.静态分析
直接用IDA打开文件,左侧函数栏(Functions)中找到main函数。按下F5打开反编译窗口

3.厘清逻辑
一般可以从输出(printf)往上看找逻辑,逻辑非常简单,对比(strcmp)s1和s2,相同打印“This is flag!!”
并且可以直接看到密文"TlNTQ1RGe2Jhc2VfNjRfTlRXUTRaR0ROQzdOfQ==",可以看出是base64加密(长度为4的倍数,不足的用“=”代替),此时就需要看加密逻辑,注意到上面与s1有关的函数是sub_124C,双击进入函数。
观察到就是最常见的base64加密逻辑A-Za-z0-9+/=
4.解密
启动加密解密网站From Base64 - CyberChef,拖入Form Base64,就可以得到flag。

小结
最简单的逆向题就是这样,如果你感兴趣的话,建议上NSSCTF上将难度星级低的题目都做一下。另外想说个观点:不少人排斥使用AI,但遇到难题时多向AI请教、借助AI解题,其实能帮助我们快速进步,重要的是要问AI每一步的解题思路是怎样的。
当你刷过不同类型的几十题后,你就有打比赛的能力了,以我为例,学习逆向一个半月的时候,已经可以在强网杯上解出题目了,关键在于要有坚持下去的毅力和自信。

浙公网安备 33010602011771号