フラグの恋:一道没做出来的编码题
这是我这次比赛唯一没做出来的题。
把失败的思路也写下来——因为方法论的教训比多做一题值钱。
我试了什么
题面(フラグの恋,即”flag 之恋”)的核心线索是**“鸡你太美”**。我当时的思路有两个:
- 把”鸡你太美”四个字分别用
"00" "01" "10" "11"的二进制编码,然后再解码; - 用
"0" "1" "2" "3"的四进制编码。
两条路都交给 AI 帮忙算了一遍,解出来全是乱码。这题就这么挂着了。
事后复盘:我错在哪
错误一:先预设编码方式,而不是先看数据统计
我上来就假定”四个符号 = 2bit”,然后开始穷举映射顺序和位序。但这个假设本身就是拍脑袋的。
正确的顺序应该是:
- 先看数据的符号表——到底有几种不同符号?出现频率分布如何?
- 如果只有 4 种符号 → 才考虑 2bit 映射;
- 如果有几十种符号 → 可能是某种码表替换(比如汉字本身映射到某个编码表);
- 如果符号是汉字/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、对抗样本,都是路径清晰的。
这题不一样:它要求我自己去发现”这是什么”。而我在这方面的直觉还很差——习惯性地往”我熟悉的技术”上套,而不是从数据出发。
这大概就是所谓的”经验不足”吧。多挂几题应该就好了(希望)。