程序无 CRT 依赖,直接使用 Windows API 进行 I/O,是一个纯手写的紧凑验证器。
程序依次提示并读取两行输入:
Serial 必须恰好 19 字符,结构为:
关键常量 n16912 = 16912 = 0x4210,其二进制位 4、9、14 置 1,标记分隔符位置。
最终校验 n16 == 16 && n0xFFFF == 0xFFFF:恰好 16 个符号,值 0-15 各出现一次(构成排列)。
使用 SSE2 pcmpeqb + pmovmskb 做一次性 16 字节比较,0xFFFF 表示全等。
当字符为 ( (ASCII 40) 时,查表值 3 与 1 异或,结果为 2。其余字符不受影响。
数据位于 0x140002000,32 个 DWORD 条目,覆盖 ASCII 33–64:
有效符号共 16 个,映射到值 0–15 形成双射:
该函数以 Name 为输入,输出一个 16 字节的排列(值 0–15 的置换)。
算法分为两阶段:
注意:当 Name 长度超过 16 时,v4 & 0xF 会回绕,同一位置可能被多次交换。
初始状态 xmmword_140002080 位于 0x140002080,内容为:
即 [0, 1, 2, ..., 15],通过 movdqa 一次性加载。
公共 Serial $/.;-):,(-#!%*-&?+@(19 字符):
解码排列:[12, 10, 8, 5, 11, 15, 13, 2, 7, 4, 1, 14, 9, 0, 6, 3]
对 Name CAAA1C964B15D9B3(16 字符)执行算法:
最终 state = [0, 6, 3, 12, 10, 8, 5, 11, 15, 13, 2, 7, 4, 1, 14, 9]
旋转量 rot = 979 & 0xF = 3
输出排列 perm[i] = state[(3+i) & 0xF]:
与 Serial 解码排列完全一致,验证通过。
Name KCTF(4 字符),ASCII: K=75, C=67, T=84, F=70
最终 state = [15, 4, 7, 11, 1, 5, 6, 2, 8, 9, 10, 3, 12, 13, 14, 0]
旋转量 rot = 297 & 0xF = 9
输出排列 perm[i] = state[(9+i) & 0xF]:
期望排列:[9, 10, 3, 12, 13, 14, 0, 15, 4, 7, 11, 1, 5, 6, 2, 8]
将 16 个值按值→符号反查表编码,并按 SSSS-SSSSS-SSSSS-SS 格式插入分隔符:
由 AI 完成。
| 项目 |
内容 |
| 题目名称 |
KCTF 2026 - Rosetta Calibration |
| 二进制文件 |
kctf_rosetta.exe |
| 架构 |
x86-64 (PE64) |
| SHA256 |
caaa1c964b15d9b3250be0dc64412e5f64c29e297a971c226e8dd705d6b87e67 |
| 公共有效对 |
Name: CAAA1C964B15D9B3 / Serial: $/.;-):,(-#!%*-&?+@ |
| 目标 |
求出 Name KCTF 对应的唯一 Serial |
| 指标 |
数值 |
| 函数总数 |
5 |
| 字符串总数 |
12 |
| 代码段 |
.text (0x140001000–0x140002000, 4KB) |
| 只读数据段 |
.rdata (0x140002000–0x140003000) |
| 导入函数 |
GetStdHandle, ReadFile, WriteFile, ExitProcess (均来自 KERNEL32.dll) |
| 入口点 |
start (0x140001000) |
| 地址 |
名称 |
大小 |
功能 |
| 0x140001000 |
start |
905B |
主函数:读取 Name/Serial,执行全部校验逻辑 |
| 0x140001390 |
sub_140001390 |
68B |
WriteFile 封装(打印字符串) |
| 0x1400013E0 |
sub_1400013E0 |
318B |
核心算法:由 Name 计算期望排列 |
| 0x140001520 |
sub_140001520 |
28B |
符号→值映射(含特殊 XOR 处理) |
| 0x140001540 |
sub_140001540 |
27B |
查表:ASCII 字符 → 值 0-15 或 -1 |
| 符号 |
ASCII |
表索引 |
查表值 |
XOR |
最终值 |
! |
33 |
0 |
4 |
0 |
4 |
" |
34 |
1 |
-1 |
— |
无效 |
# |
35 |
2 |
7 |
0 |
7 |
$ |
36 |
3 |
12 |
0 |
12 |
% |
37 |
4 |
1 |
0 |
1 |
& |
38 |
5 |
9 |
0 |
9 |
' |
39 |
6 |
-1 |
— |
无效 |
( |
40 |
7 |
3 |
1 |
2 |
) |
41 |
8 |
11 |
0 |
11 |
* |
42 |
9 |
14 |
0 |
14 |
+ |
43 |
10 |
6 |
0 |
6 |
, |
44 |
11 |
13 |
0 |
13 |
- |
45 |
12 |
-1 |
— |
无效(分隔符) |
. |
46 |
13 |
8 |
0 |
8 |
/ |
47 |
14 |
10 |
0 |
10 |
0–8 |
48–56 |
15–23 |
-1 |
— |
无效 |
9 |
57 |
24 |
-1 |
— |
无效 |
: |
58 |
25 |
15 |
0 |
15 |
; |
59 |
26 |
5 |
0 |
5 |
< |
60 |
27 |
-1 |
— |
无效 |
= |
61 |
28 |
-1 |
— |
无效 |
> |
62 |
29 |
-1 |
— |
无效 |
? |
63 |
30 |
0 |
0 |
0 |
@ |
64 |
31 |
3 |
0 |
3 |
| 值 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
| 符号 |
? |
% |
( |
@ |
! |
; |
+ |
# |
. |
& |
/ |
) |
$ |
, |
* |
: |
| 位置 |
符号 |
值 |
| 0 |
$ |
12 |
| 1 |
/ |
10 |
| 2 |
. |
8 |
| 3 |
; |
5 |
| 4 |
- |
分隔符 |
| 5 |
) |
11 |
| 6 |
: |
15 |
| 7 |
, |
13 |
| 8 |
( |
2 |
| 9 |
- |
分隔符 |
| 10 |
# |
7 |
| 11 |
! |
4 |
| 12 |
% |
1 |
| 13 |
* |
14 |
| 14 |
- |
分隔符 |
| 15 |
& |
9 |
| 16 |
? |
0 |
| 17 |
+ |
6 |
| 18 |
@ |
3 |
| 轮次 |
字符 |
ASCII |
v6=c^(c>>4) |
v5(累加) |
v3 |
v7=(v3^v6)&0xF |
交换位置 |
state 变化 |
| 0 |
C |
67 |
71 |
71 |
0 |
7 |
[0]↔[7] |
[7,1,2,3,4,5,6,0,...] |
| 1 |
A |
65 |
69 |
140 |
3 |
6 |
[1]↔[6] |
[7,6,2,3,4,5,1,0,...] |
| 2 |
A |
65 |
69 |
209 |
6 |
3 |
[2]↔[3] |
[7,6,3,2,4,5,1,0,...] |
| 3 |
A |
65 |
69 |
278 |
9 |
12 |
[3]↔[12] |
[7,6,3,12,...,2,...] |
| 4 |
1 |
49 |
50 |
328 |
12 |
14 |
[4]↔[14] |
[...,14,...,4,...] |
| 5 |
C |
67 |
71 |
399 |
15 |
8 |
[5]↔[8] |
[...,8,...,5,...] |
| 6 |
9 |
57 |
58 |
457 |
18 |
8 |
[6]↔[8] |
[...,5,...,1,...] |
| 7 |
6 |
54 |
53 |
510 |
21 |
0 |
[7]↔[0] |
[0,...,7,...] |
| 8 |
4 |
52 |
55 |
565 |
24 |
15 |
[8]↔[15] |
[...,15,...,1] |
| 9 |
B |
66 |
70 |
635 |
27 |
13 |
[9]↔[13] |
[...,13,...,9,...] |
| 10 |
1 |
49 |
50 |
685 |
30 |
12 |
[10]↔[12] |
[...,2,...,10,...] |
| 11 |
5 |
53 |
54 |
739 |
33 |
7 |
[11]↔[7] |
[...,11,...,7,...] |
| 12 |
D |
68 |
64 |
803 |
36 |
4 |
[12]↔[4] |
[...,10,...,14,...] |
| 13 |
9 |
57 |
58 |
861 |
39 |
13 |
[13]↔[13] |
(无变化) |
| 14 |
B |
66 |
70 |
931 |
42 |
12 |
[14]↔[12] |
[...,4,...,14,...] |
| 15 |
3 |
51 |
48 |
979 |
45 |
13 |
[15]↔[13] |
[...,1,...,9] |
| 轮次 |
字符 |
ASCII |
v6=c^(c>>4) |
v5(累加) |
v3 |
v7=(v3^v6)&0xF |
交换 |
state 变化 |
| 0 |
K |
75 |
79 |
79 |
0 |
15 |
[0]↔[15] |
[15,1,2,3,4,5,6,7,8,9,10,11,12,13,14,0] |
| 1 |
C |
67 |
71 |
150 |
3 |
4 |
[1]↔[4] |
[15,4,2,3,1,5,6,7,8,9,10,11,12,13,14,0] |
| 2 |
T |
84 |
81 |
231 |
6 |
7 |
[2]↔[7] |
[15,4,7,3,1,5,6,2,8,9,10,11,12,13,14,0] |
| 3 |
F |
70 |
66 |
297 |
9 |
11 |
[3]↔[11] |
[15,4,7,11,1,5,6,2,8,9,10,3,12,13,14,0] |
| i |
(9+i)&0xF |
state[...] |
值 |
| 0 |
9 |
state[9] |
9 |
| 1 |
10 |
state[10] |
10 |
| 2 |
11 |
state[11] |
3 |
| 3 |
12 |
state[12] |
12 |
| 4 |
13 |
state[13] |
13 |
| 5 |
14 |
state[14] |
14 |
| 6 |
15 |
state[15] |
0 |
| 7 |
0 |
state[0] |
15 |
| 8 |
1 |
state[1] |
4 |
| 9 |
2 |
state[2] |
7 |
| 10 |
3 |
state[3] |
11 |
| 11 |
4 |
state[4] |
1 |
| 12 |
5 |
state[5] |
5 |
| 13 |
6 |
state[6] |
6 |
| 14 |
7 |
state[7] |
2 |
| 15 |
8 |
state[8] |
8 |
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。