-
-
[原创] 看雪·2026 KCTF 第五题:申时·忆海倒带
-
发表于: 4天前 10
-
题是AI做的,人都没打开看,题解贴AI自动生成的长篇writeup毫无意义(更没必要搞什么点赞/回复可见,发论坛是为了公开交流),不如写点给人看的话。
在第二题的题解中提到过Harness的重要性。我的codex似乎被上下文配置或长期记忆等污染的很严重,5.6 Sol每句对话都会触发外部审查,然后是安全风险+无法显式此对话;5.5能跑,但明显感觉没有5.6有洞察力。
第三题 “只管出不管做” 大佬的 wp 很震撼 https://bbs.kanxue.com/thread-292518.htm ,ChatGPT 自己自动解决了,而且每轮对话都能跑 120min;我在网页尝试复现的时候,刚开始总是几分钟就停一下说一句小发现,后来发现是记忆的影响,关掉记忆后终于能一次对话跑 60min 了(但差不多也只能跑这么长,感觉像 Plus 订阅的限制),然而还是始终没有突破。可惜 5.6 Sol拒答,Plus订阅也无法选择xHigh等更高思考等级,估计Pro订阅才能能跑到120min的深度。
第四题情况类似,由于 Codex 额度剩的不多了,只能在 ChatGPT 网页对话用 GPT 5.5 跑;对话上下文快用尽时让它把文档和脚本打包zip下载然后开新对话。跑了周末两天,它真的一直在改进windows环境模拟,然后最后还是没能把核心逻辑完全逆清楚。
(p.s. ChatGPT的网页现在功能很强,基本相当于一个不能定制环境的云端Codex,最重要的是不耗额度,否则周末的实验根本烧不起)
切实感受,对于强模型,越多的上下文和依赖反而会制约它;而弱模型,一百个臭皮匠也顶不了一个诸葛亮,灵感和洞察力才是强模型的竞争力(不过,弱模型配一个强Harness可以在实际任务中获得超越强模型配弱Harness的效果,这是工程优化和人的力量弥补了模型的不足,那如果是强Harness配强Harness,上限会有多大呢)。模型的中间思考值得人一直关注,有时里面会涌现一些关键点但被它自我否决。
关于第五题,感觉我的本地Codex还是没调整好,上下文仍然有污染;给了它IDA和x64dbg的mcp和Skills,以及Agents.md的指令,反而耗时10分钟才做出来;相同的GPT 5.5 High,在网页ChatGPT上只给题目附件,5分钟出答案。
(Human)
分隔线
(AI)
网页chatgpt,5分钟解决(GPT 5.5 High)

本地codex,10分钟才解决(GPT 5.5 High)(另外并行开了一个 GPT 5.6 Terra xHigh,中间还触发了外置审查,用时21分钟出答案,二者合计烧了 8% 的 Plus 周额度;GPT 5.6 Sol 触发 Cyber Risk 拒答)




附录1:GPT 5.5 High 的解题报告
第五题_分析报告.md
本地验证:
main 地址为 0x403D90。明文字符串 admin123、r3v3rs3! 以及若干开发者注释均为干扰项,真正逻辑集中在 main 的输入解析、校验和最终查表比较中。
主要校验点:
sub_402100 是十六进制字符串转大整数:
大整数使用 32-bit little-endian limb。sub_402510 是模幂计算,sub_4022D0 将大整数转回大写 hex 字符串。
在 sub_403500 中恢复出的参数为:
n 的两个因子:
最终目标字符串经查表逆映射得到 44 字节目标内部缓冲:
其中前 28 字节直接作为输入前 56 个 hex 字符。后 16 字节是模幂输出目标:
用私钥指数求逆:
于是输入最后 32 个 hex 字符为:
拼接得到最终序列号。
复现脚本已保存为:
运行:
脚本会:
q5_solve.py
附录2:GPT 5.6 Terra xHigh 的解题报告
(与上面对比,阅读感受差别还挺大的)
第五题_分析与验证报告.md
这是 88 个大写十六进制字符。将其输入原始 cm.exe 后,程序输出:
分析样本的 SHA-1 为 d1c8124c5964af1531c6e311328854a05ca40bca,与题目 readme.txt 给出的值一致。
_main(0x403D90)在 0x403F81 读取输入,并在 0x404040 以 16 进制解析成自定义大整数。其前置约束为:
显示的 admin123、r3v3rs3!、password 及其“开发者注释”均为诱饵:sub_403C60 (0x403C60) 在入口调用的 sub_403230/sub_4032E0 只用于干扰和异常路径,未参与最终成功分支。
完整性门通过后,0x40427D 调用 sub_403500。在其 0x403A21 调用点进行运行时取证得到固定 RSA 参数:
n 可分解为:
因此可计算私钥指数 d = e^-1 mod ((p-1)(q-1)),进而反解最后 16 个输入字节。动态交叉验证中,令该 16 字节输入全为 0x11 时,程序在结果缓冲区写入:
它与独立计算的 0x1111...1111 ^ 65537 mod n(大端字节序)完全一致。
0x4044F8–0x404540 遍历 44 个字节,并在 0x40450E 调用 sub_404870 进行最终查表。查表状态由 sub_4033D0 (0x4033D0) 建立:
对目标明文的每个字符,在 255 个可用源字节中反查唯一前像,得到 44 字节待映射数据。前 28 字节直接组成注册码的前 56 个十六进制字符;后 16 字节是 RSA 密文,使用上述私钥指数反解后组成后 32 个十六进制字符。最后再次计算两道前置校验并通过。
solve_q5.py 直接从未修改的 cm.exe 提取置换表和字节表,反解 RSA,并在输出前断言:查表可逆、RSA 逆变换正确、XOR 校验正确、滚动校验正确。
运行: