首页
社区
课程
招聘
[原创] 看雪·2026 KCTF 第七题:戌时·暗能潜流
发表于: 14小时前 268

[原创] 看雪·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 实际代表:

即周期:

对应的实际操作为:

需要注意的是:

密钥中的 12 并不是简单地表示“加 1”和“加 2”,而是用于选择两种固定的半字节变换模式。

这也是题目要求在 WP 中解释的重点。

逆过程非常简单。

加密:

设密文字节半字节为:

则:

加密:

所以:

将上一步提取出的有效字节执行密钥逆变换。

得到:

这非常关键。

可以发现:

并不是随机变化,而是固定的位置重排。

继续分析样例。

只有 3 字节:

变成:

相当于:

即一个 3-byte 块内部进行右循环 1 位。

从字符串右侧每 3 字节分组:

先处理最右侧:

剩余开头 2 字节:

并且输出顺序是从右向左:

与解出的中间结果完全一致。

从右侧分组:

处理:

从右向左拼接:

完全吻合。

分组:

处理完整块:

再处理单字节:

最后:

同样吻合。

加密时:

因此它本质上是:

这也解释了 HexMaze 中 “Maze” 的含义:数据位置被进行了固定迷宫式重排。

FLAG 密文:

首先按照前面总结出的固定骨架提取有效半字节。

然后依次按照密钥周期:

执行逆半字节变换。

得到 HexMaze 位置重排后的中间结果:

将中间字符串按照 3 字节分组:

完整块在加密时为:

因此解密时执行左循环 1 位:

逐块得到:

由于加密过程中块顺序发生了反转,因此解密时需要再次反转块顺序。

最后剩余的单字节:

放回最前方。

最终得到:

拼接:

运行结果:

整个 HexMaze 可以概括为四层。

从字符串右侧按照 3 字节分块。

完整块:

两字节块:

单字节:

同时块顺序从右向左输出。

对每个字节拆分:

121 周期处理。

1

2

因此:

循环执行。

每 3 个数据字节被嵌入固定骨架:


传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!

最后于 14小时前 被mb_mgodlfyn编辑 ,原因:
收藏
免费 0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回