首页
社区
课程
招聘
[原创]KCTF2026 - 第五题:申时·忆海倒带 题解(AI)
发表于: 1天前 26

[原创]KCTF2026 - 第五题:申时·忆海倒带 题解(AI)

1天前
26

32 位 PE,无壳,校验逻辑里没有一处反调试。程序把大数的 limb 和字符表都存在一个带索引置换
容器里(本文称 RewindArray),于是 RSA 的 n/e.data 里直接 dump 完全看不出来。
跟着置换表把参数捞出来,分解 128 位的 n,反推序列号即可,总体难度较低

PDB 路径没清有些难绷:E:\kanxue\KCTF\2026\rsa_tf-20260802\Release\ca_tf6.pdbRSA

main 里反复出现 for (i=0; i<2048; ++i) *sub_402A70(i) = 0;
跟进 sub_402A70

RewindArray::at

顺序 dump n 的数据段:

n 在数据段里的样子

perm 取回来就齐了(第 4 个 limb 在 perm[3] = 2037 槽):

.data 里 6 个 0x2000 字节的缓冲区从 0x42C018 步长 0x2000 连续排到 0x436018
同组的三块并不相邻(见上表)。invperm 的逆,脚本里拿来当校验。
注意那四段 perm/inv 本身是完整的 0..2047 置换表,不是零 —— 只有两段 buf 才是「一片零加几个孤立值」。

图片描述

第三道要留意:累加器是 32 位,但只比较低 16 位(正确答案的 32 位和是 0x6BEFF)。

第四道的映射表在 0x438030buf=0x4263B0perm=0x4163B0inv=0x406380
物理表 0x4000 项(perm + 0x10000 严格接上 buf;结构体的 size 字段运行期是 0x408F
只用于越界判断,与结论无关)。索引是 (signed char)v - 1,只有 v ∈ [1,127] 走置换分支;
v = 96..127 共 32 个值一律映到 0,而所有非零输出各只有唯一原像 ——
目标串不含 0 字节,所以这 44 个字节被唯一钉死:

终检映射

真正的坑在这里

Bufferebp-0x858var_820ebp-0x820,差 0x38 = 56
RSA 只作用于输入的后 32 个 hex 字符,前 56 个原样进终检
sub_403500 返回后,0x4043B7 处的 16 次循环把模幂结果盖回 44 字节的最后 16 字节)。
Hex-Rays 在此把 this 和参数全丢成 sub_403500();,按「整个 88 位输入对 n 取模」去解,
会得到 LL + n 两个都小于 2^128 的候选,第 ②③ 道校验一个都过不了。

于是解直接拆成两半:高 28 字节查表直出,低 16 字节 L = C^d mod n

128 位半素数,mac 上 yafu / msieve / gmp-ecm 一个都没有,自己写反而更快:
Brent-rho + R = 2^128 的 Montgomery(mul256 出 256 位积,redc 归约),
10 核并行不同种子,几秒出解(完整源码见 rho128.c):

完整求解链,直接从 cm.exe 读参数,端到端复现序列号:


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

最后于 8小时前 被星野安全编辑 ,原因: 补充代码文件
上传的附件:
收藏
免费 1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回