-
-
KCTF 2026 第5关 cm.exe Write-up
-
发表于: 2026-8-17 13:14 19
-
最终 Key:
原始未 patch 程序验证:
样本 SHA1 与 readme 一致:
先做事实表,不直接相信可见字符串。这个样本里确实有不少诱导内容,比如 admin123、password、r3v3rs3!、n0_4i_c4n_r34d_th1s!,以及 FIXME/TODO/NOTE 风格的“作者提示”。这些都只作为 bait 处理,必须通过 xref 和运行结果验证。
静态信息:
关键 xref:
一次性 smoke test 结果:
因此可见字符串路线证伪,不再重复尝试。
主函数在 0x403d90 附近。输入读取后,程序把输入按 hex 字符串解析成大整数/字节数组。长度要求来自下面逻辑:
所以 Key 是 88 个大写 hex 字符,对应 44 bytes。
后续有两个 guard:
即 44 bytes 的 XOR 必须为 0x8f。
等价伪代码:
一开始我把 44 bytes 全部直接按最终表反查,能得到目标映射输入,但 XOR/checksum 对不上。这说明中间还有覆盖或变换。继续看 0x403500,发现它会生成末尾 16 bytes。
主流程:
0x403500 内部可归约为:
其中 modulus 来自静态 BigInt 表:
分解:
最终比较目标位于 0x416380:
程序在 0x4044f8..0x40457c 把 44 bytes 逐字节通过表 0x4163b0/0x4263b0 映射,再和 0x416380 比较。
表反查后,需要被映射的 44 bytes 为:
前 28 bytes 是原始输入前缀;后 16 bytes 是 RSA 输出。因此先 RSA 私钥反解 tail:
组合得到原始 44 bytes:
转大写 hex 即最终 Key。
模型输出:
原始程序运行:
最终 Key:
323C47184B0D3C44254B445842552F365C362C1144424B0D3C4416433B0DD6B12A0D3D95FA65B5E0ADE5E11B
[招生]科锐逆向工程师培训(2026年11月13日实地,远程教学同时开班, 第57期)