-
-
[原创] 看雪·2026 KCTF 第七题:戌时·暗能潜流
-
发表于: 14小时前 268
-
一道完完全全出给AI的题,不会真的有人自己脑洞出来吧()初版题目给的条件甚至太模糊,出题人后续更新了题目说明。
5.6 Sol 还是比 5.5 强太多了,但甲也太厚了,前几天甚至打个hello都会触发外置审查;在夹缝中摇奖偶然摇出一个能跑的对话,题目丢上去10分钟速出结果
362K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6U0K9r3q4@1k6%4m8@1i4K6u0W2j5$3!0E0i4K6u0r3M7$3S2S2M7X3g2Q4x3V1j5$3j5e0R3%4j5U0M7^5x3q4)9J5k6o6u0T1y4K6S2Q4x3X3b7^5x3$3g2S2i4K6u0V1j5e0j5K6z5q4)9J5k6o6k6U0k6U0p5K6x3h3g2S2z5o6W2W2k6R3`.`.
5.5 反复兜圈子,耗时2个多小时+9轮对话,在 5.6 Sol 出了结果之后很快跟着给了答案(虽然我关了记忆,但很难不怀疑是跨会话偷了答案)
74eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6U0K9r3q4@1k6%4m8@1i4K6u0W2j5$3!0E0i4K6u0r3M7$3S2S2M7X3g2Q4x3V1j5$3j5e0R3%4j5X3t1%4j5W2)9J5k6o6q4U0y4o6c8Q4x3X3b7^5x3$3g2S2i4K6u0V1z5o6V1K6k6q4)9J5k6r3y4U0x3e0t1%4j5U0b7@1j5K6R3@1z5b7`.`.
(不得不说 OpenAI 给 Cyper 护栏加的位置很精准,前面几道题 5.6 Sol 始终拒答,5.5 畅通无阻但几乎没有任何实质性进展;贴一个第六题 GPT 5.5 的发疯记录,d71K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6U0K9r3q4@1k6%4m8@1i4K6u0W2j5$3!0E0i4K6u0r3M7$3S2S2M7X3g2Q4x3V1j5$3j5e0R3%4j5X3t1%4j5W2)9J5k6o6q4U0y4o6c8Q4x3X3b7^5x3$3g2S2i4K6u0V1z5o6V1K6k6q4)9J5k6r3y4U0x3e0t1%4j5U0b7@1j5K6R3@1z5b7`.`. ,想让它自助的希望破灭后(有十几个失败对话就不贴了),我改成人工为主,以人的思路一步步引导它解混淆(它特别喜欢约束求解、暴力枚举、模拟执行、上网搜答案作弊,而且网页对话(p.s.本地Codex额度用完了)似乎有系统提示词要求它每一小步都停下来回复对话,很难像本地一样一个长任务设定目标后一直跑;另外一定要给它能自我验证的方式,到后半程才想起来给它一个 qemu,效率提升很多);最后终于整出了一个看似脱完混淆的python算法(也不知道对不对),但是它不会反解 …… 感觉 5.6 Sol 的能力应该是够的(Claude Opus 5应该也行,但我没有A÷的订阅),可惜它不给做)
以上是人
(分隔线)
以下是AI
题目给出了一个名为 HexMaze 的确定性加密程序,并明确说明:
已知样例:
FLAG 密文:
目标是根据已知明密文恢复完整算法,并解释密钥 121 中每一位数字的具体作用。
先统计样例的输入和输出长度。
可以发现,密文总是按照 6 字节一组输出。
进一步观察:
因此可以猜测:
每 3 个明文字节经过处理后,对应一个固定长度为 6 字节的密文块。
也就是:
对于不足 3 字节的尾部,则仍然补成一个完整的 6 字节输出块。
以完整 3 字节样例 TLU 为例:
再观察其他完整块:
可以看到一个明显规律:
也就是说,一个完整 6 字节块可以表示成:
其中固定的半字节为:
真正变化、也就是承载数据的半字节只有:
所以从一个完整 6-byte 块中提取有效数据的方法为:
共得到 6 个十六进制半字节,恰好组成 3 个字节。
题目提示:
摘要扰动过程只与输入长度有关。
这与尾块的现象完全吻合。
观察:
前 3 个字符形成一个完整块:
最后只剩 1 个字符,对应尾块:
其结构为:
只有最后两个高半字节携带实际数据。
观察 Hello:
尾部结构为:
因此尾块的固定形式只取决于:
这正是题目所说的“固定摘要扰动只与输入长度有关”。
FLAG 密文长度为 144 个十六进制字符:
每个密文块 6 字节,因此共有:
观察最后一个块:
形式与 2026 的余 1 字节尾块一致:
所以 FLAG 长度满足:
前 11 个块各自对应 3 字节,最后一个块对应 1 字节:
因此 FLAG 总长度为:
去掉每个 6-byte 块中的固定骨架,只保留有效半字节。
密文:
提取:
组成:
提取得到:
得到:
得到:
于是数据层为:
接下来需要研究这些字节与 ASCII 明文之间的关系。
把一个 ASCII 字节写成两个十六进制半字节:
其中:
通过对四组样例逐字节比较,可以还原出密钥 121 对应的三周期操作。
当当前位置对应密钥数字 1 时:
即:
公式写作:
当当前位置对应密钥数字 2 时,不交换半字节:
即:
所以 121 实际代表:
即周期:
对应的实际操作为:
需要注意的是:
密钥中的 1 和 2 并不是简单地表示“加 1”和“加 2”,而是用于选择两种固定的半字节变换模式。
这也是题目要求在 WP 中解释的重点。
逆过程非常简单。
加密:
设密文字节半字节为:
则:
加密:
所以:
将上一步提取出的有效字节执行密钥逆变换。
得到:
这非常关键。
可以发现:
并不是随机变化,而是固定的位置重排。
继续分析样例。
只有 3 字节:
变成:
相当于:
即一个 3-byte 块内部进行右循环 1 位。
从字符串右侧每 3 字节分组:
先处理最右侧:
剩余开头 2 字节:
并且输出顺序是从右向左:
与解出的中间结果完全一致。
从右侧分组:
处理:
从右向左拼接:
完全吻合。
分组:
处理完整块:
再处理单字节:
最后:
同样吻合。
加密时:
因此它本质上是:
这也解释了 HexMaze 中 “Maze” 的含义:数据位置被进行了固定迷宫式重排。
FLAG 密文:
首先按照前面总结出的固定骨架提取有效半字节。
然后依次按照密钥周期:
执行逆半字节变换。
得到 HexMaze 位置重排后的中间结果:
将中间字符串按照 3 字节分组:
完整块在加密时为:
因此解密时执行左循环 1 位:
逐块得到:
由于加密过程中块顺序发生了反转,因此解密时需要再次反转块顺序。
最后剩余的单字节:
放回最前方。
最终得到:
拼接:
运行结果:
整个 HexMaze 可以概括为四层。
从字符串右侧按照 3 字节分块。
完整块:
两字节块:
单字节:
同时块顺序从右向左输出。
对每个字节拆分:
按 121 周期处理。
1:
2:
因此:
循环执行。
每 3 个数据字节被嵌入固定骨架: