-
-
[原创]# KCTF 2026 签到题「辰时·钟鸣破晓」Writeup
-
发表于: 2026-8-17 13:49 22
-
题目信息
- 文件:
kctf_rosetta.rar→kctf_rosetta.exe(x86-64 控制台 PE,4KB) - 已知合法对:
- Name =
CAAA1C964B15D9B3 - Serial =
$/.;-):,(-#!%*-&?+@
- Name =
- 目标:求 Name =
KCTF对应的唯一 Serial
逆向分析
程序为「名称 → 序列号」注册算法:
- 读取 Name(≤39 字符)与 Serial(必须恰好 19 字符)。
- Serial 校验:
- 在固定位置 4、9、14(0-based)必须是
-(由位掩码0x4210= 位 4/9/14 决定)。 - 其余 16 个字符经「字典表」映射到
0..15的一个排列(互不相同、覆盖全部 16 个值)。
- 在固定位置 4、9、14(0-based)必须是
- 核心函数
0x1400013e0(Rosetta 校准):- 初始 S-box = 恒等排列
[0..15](位于 0x140002080)。 - 用 Name 作种子,对 S-box 做类 Fisher-Yates 洗牌:对每字符
c,idx=i&0xf,edi=((c>>4)^c)&0xf(累加进a),再edi^=(r9&0xf),r9+=3,交换S[idx]与S[edi]。 - 输出
out[k] = S[(a+k)&0xf],k=0..15(a为最终累加和)。
- 初始 S-box = 恒等排列
- 将 16 字节
out与 Serial 解析出的符号序列逐字节比较,全相等则校准通过。 - 字符→符号字典表位于 0x140002000(32 个 dword,索引 =
(char+0xdf)&0xff,有效范围字符'!'..'@');'('特殊处理(^1)。
求解
用 Python 复现上述算法,generate(name) 复原 out,再经反向字典映射为字符并插入 3 个 -,得到 19 位 Serial。
以已知对 CAAA1C964B15D9B3 自校验:复现结果与原 Serial 完全一致,且回解析吻合 → 算法正确。
答案
- Name
KCTF的 Serial 为:
&/@$-,*?:-!#)%-;+(.
(19 字符,dash 在 4/9/14;16 个非 dash 字符对应符号序列 9,10,3,12,13,14,0,15,4,7,11,1,5,6,2,8,是 0–15 的排列,与 generate(b'KCTF') 吻合。)
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。
赞赏
他的文章
赞赏
雪币:
留言: