第十课:钟表铺的大赛——CTF 实战
对应原书第 16 章《CTF 逆向实战模式》与第 51 章《CTF 比赛实战策略》
第十天,陈师傅在铺子门口贴了一张红纸:"全镇修钟大赛:谁能修好我这只最难的钟?"
消息传开,半条街的人都来了。陈师傅从柜台下抱出一只古铜色的钟——钟面刻着花纹,齿轮精密得像瑞士表,旁边放着一张卡片,上面写着一行字:
这只钟只认一句"密语"。说出密语,钟就响。
(提示:密语藏在钟的每一个零件里。)
围观的人纷纷上手。有人摇,有人敲,有人试图撬开后盖——结果"咔哒"一声,钟直接锁死了。
"别急,"陈师傅慢悠悠地说,"它锁死是因为你乱拆。让我徒弟来。小林,上。"
小林深吸一口气,走到钟前。他没有立刻动手,而是先围着钟转了一圈,然后掏出放大镜,把钟面的花纹、齿轮的咬合、底座的刻字看了个遍。
"师傅,"小林说,"这钟和第一天的钟不一样。第一天的钟把密语写在'表面'(strings 能看到)。这只钟……把密语拆成了零件,藏在很多地方。"
"好眼力。那怎么办?"
小林想了想:"把每个零件都看一遍,然后拼起来。"
他花了三个小时:先听(strings)、再拆(radare2)、找到好几个"疑似零件"(比较点/常量/加密函数),最后在纸上拼出一条完整的"密语生成链"——原来密语是"日期 + 齿轮号 + 一个固定单词"经过三次变换得到的。
"密语是……'1984-07-15-gear-master'。"
古铜钟"当——"地响了。
围观众人鼓掌。陈师傅点点头,对人群说:"今天这个比赛,其实就是'CTF'——一种解谜比赛。修钟是解谜,解程序也是解谜。我徒弟用到的,就是我们这十天学的全部本事:先听、再拆、找比较点、绕机关、拼逻辑。"
课程正文
CTF(Capture The Flag) = 夺旗比赛:给一个"藏着 flag 的程序",解出 flag 拿分。逆向题的核心就是:程序里藏着一句话,找到它,证明你懂程序。
逆向题的通法(十课精华汇总)
1. 先听: strings / file / ltrace(第 2/5 课)—— 可能直接出答案
2. 再拆: radare2 / jadx / IDA(第 3/8 课)—— 看结构
3. 找比较点: 程序一定"比较"(第 3 课)—— 答案在比较对象里
4. 绕机关: 反调试/混淆(第 7 课)—— 先让它"不咬人"
5. 动态看: GDB/Frida(第 5/6 课)—— 让它自己说
6. 拼逻辑: 加密/变换链(第 4 课)—— 反着推回去
快速捡漏(第一件事就做)
strings 程序 | grep -iE "flag|CTF|secret" # 明文 flag 直接出
ltrace ./程序 # 旁白泄露答案
三个最常见的坑(新手必看)
坑 1: 诱饵 flag
程序里有好几个"假答案",真的藏在最后
→ 找"最终成功提示"的引用点,别在第一个比较就停
坑 2: 比较方向搞反
transform(你的输入) == 存的值 → 反着变换
transform(存的值) == 你的输入 → flag 就是变换后的存值
→ 先判断方向再动手
坑 3: 死磕单题
比赛里时间就是分数
→ 30 分钟没进展就换题(或换方法),别死磕
比赛策略(第 51 章精华)
赛前: 工具装好(radare2/Frida/angr/strings 全家桶)
赛中:
1. 开场扫所有题 → 先拿简单分
2. 每题设 30 分钟死线 → 超时换题
3. 记录每题思路(断了能接上)
赛后: 复盘(每题: 思路/卡点/解法)
陈师傅的话
"CTF 不是考'会不会背工具',是考'会不会想'。十天前你不会拆钟,今天你能拆最难的那只——不是因为工具多了,是因为你学会了'先看、再猜、最后动手'。"
本课口诀
先听、再拆、找比较、绕机关、拼逻辑。三十分钟没戏就换题。
动手做
- 上 crackmes.one 找一道最简单的题,用十课全部方法解掉它。
- 练习"诱饵 flag":写两个比较点(一个假一个真),练习找到真的。
- 给自己定"30 分钟死线"规则,模拟一次比赛。
- 把十课口诀背下来——它就是你的"拆钟心法"。
想学更深的
见原书 第 16 章《CTF 逆向实战模式》(60+ 实战模式)、第 51 章《CTF 比赛实战策略》(赛前/赛中/赛后全流程)、第 21 章《实战练习平台指南》(crackmes.one/picoCTF 等练手)。