首页
社区
课程
招聘
[原创]# KCTF 2026 签到题「辰时·钟鸣破晓」Writeup
发表于: 2026-8-17 13:49 22

[原创]# KCTF 2026 签到题「辰时·钟鸣破晓」Writeup

2026-8-17 13:49
22

题目信息

  • 文件:kctf_rosetta.rar → kctf_rosetta.exe(x86-64 控制台 PE,4KB)
  • 已知合法对:
    • Name = CAAA1C964B15D9B3
    • Serial = $/.;-):,(-#!%*-&?+@
  • 目标:求 Name = KCTF 对应的唯一 Serial

逆向分析

程序为「名称 → 序列号」注册算法:

  1. 读取 Name(≤39 字符)与 Serial(必须恰好 19 字符)。
  2. Serial 校验:
    • 在固定位置 4、9、14(0-based)必须是 -(由位掩码 0x4210 = 位 4/9/14 决定)。
    • 其余 16 个字符经「字典表」映射到 0..15 的一个排列(互不相同、覆盖全部 16 个值)。
  3. 核心函数 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 为最终累加和)。
  4. 将 16 字节 out 与 Serial 解析出的符号序列逐字节比较,全相等则校准通过。
  5. 字符→符号字典表位于 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内核攻防全技术栈,打造具备自动化能力的内核开发高手。

收藏
点赞 ・0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回