フラグの恋:一道没做出来的编码题

这是我这次比赛唯一没做出来的题。

把失败的思路也写下来——因为方法论的教训比多做一题值钱。

我试了什么

题面(フラグの恋,即”flag 之恋”)的核心线索是**“鸡你太美”**。我当时的思路有两个:

  1. 把”鸡你太美”四个字分别用 "00" "01" "10" "11" 的二进制编码,然后再解码;
  2. 用 "0" "1" "2" "3" 的四进制编码。

两条路都交给 AI 帮忙算了一遍,解出来全是乱码。这题就这么挂着了。

事后复盘:我错在哪

错误一:先预设编码方式,而不是先看数据统计

我上来就假定”四个符号 = 2bit”,然后开始穷举映射顺序和位序。但这个假设本身就是拍脑袋的。

正确的顺序应该是:

  1. 先看数据的符号表——到底有几种不同符号?出现频率分布如何?
  2. 如果只有 4 种符号 → 才考虑 2bit 映射;
  3. 如果有几十种符号 → 可能是某种码表替换(比如汉字本身映射到某个编码表);
  4. 如果符号是汉字/emoji → 考虑”字符本身就是一个码元”,而不是”字符代表二进制”。

我跳过了第一步,直接跳到第二步。

错误二:把”穷举”当成了”验证”

四符号 ↔ 2bit 的映射,理论上要穷举:

  • 四个符号到 00/01/10/11 的排列(4! = 24 种)
  • 位序(MSB-first / LSB-first,2 种)
  • 每字节内的组合顺序

组合数不多,我确实都跑了一遍,全出乱码。但穷举完之后我没有回过头质疑前提——而是继续在”映射”这个框里打转。

一个更有效的判据是:如果所有排列都出乱码,那大概率不是这个编码体系,而不是”我还没穷举够”。

错误三:忽略了”字面意思”

题名叫”フラグの恋”,日语。线索是”鸡你太美”——这是个中文网络梗。

“恋”(koi)和”鲤鱼”(koi)同音。这种双关可能在提示什么,但我当时完全没往这个方向想,一门心思扑在二进制编码上。

CTF 题目里,题名和题面文字几乎不会是废话。

留给下次的检查清单

再遇到这类”编码/隐写”题,我打算按这个顺序走:

  • 统计符号表:到底有多少种不同符号?各出现多少次?
  • 看字符类型:ASCII 可见字符 / 汉字 / emoji / 控制字符?
  • 算信息量:符号数 × 每符号 bit 数,跟预期 flag 长度对得上吗?
  • 试常见编码:Base 家族、URL 编码、Unicode 变体、摩斯、盲文?
  • 查题面文字:标题、梗、双关是不是在提示码表?
  • 失败后回头质疑前提,而不是加大穷举力度。

一点感想

这题的失败挺有价值的。之前做的题大多是”我知道是什么攻击,去实现它”——RSA、Base58、对抗样本,都是路径清晰的。

这题不一样:它要求我自己去发现”这是什么”。而我在这方面的直觉还很差——习惯性地往”我熟悉的技术”上套,而不是从数据出发。

这大概就是所谓的”经验不足”吧。多挂几题应该就好了(希望)。