样本:cm.exe(官方 SHA1:d1c8124c5964af1531c6e311328854a05ca40bca)
成功:输入一串字符,回车后打印 verify success.
详细逐步稿见附件 第五题「申时·忆海倒带」详细版.md。本文只当地图:先看整条路,再按需翻细稿。
88 个十六进制字符 = 44 个字节。
倒着求:欢迎语 → 反查 S 得到覆盖后块 → 前 28 直接当 K 的头 → 后 16 做反向模幂得到 K 的尾。
这些字符串程序里都有,但不是成功输入:
主函数在 0x403D90。提示句 0x40622C,失败句 0x406240,成功句 0x406258。
两道门都只检查同一串 44 字节 K,不算欢迎语。对不上就直接失败。
门 A:44 字节全部异或,结果必须是 0x8F
异或:两个比特相同得 0、不同得 1。一个字节 8 位,就 8 位各自做一次。
从 0x00 起,按顺序和每一个 K 字节异或,最后剩下 1 个字节:
用 K 开头三个真实字节核对算法:
代码:0x4041BC cmp al, 0x8F
门 B:滚动乘加,只看低 16 位,必须是 0xBEFF
再扫同一串 K。准备整数 acc,从 0 起。每来一个字节 b:
「最低 7 比特」= acc 除以 128 的余数,范围 0~127。
「滚动」= 这一步的乘数用的是上一步加完的 acc,改中间任一字节,后面全变。
「低 16 位」= acc 可以很大,比较时只看最右边 4 个十六进制位。例如 0x0006BEFF 的低 16 位是 0xBEFF。
用 K 开头三个真实字节核对算法:
44 步走完,低 16 位必须是 0xBEFF。
代码:0x40425F mov eax, 0xBEFF,然后只比 acc 的低 16 位。
模幂得到 16 字节,覆盖到 K 的尾部:
| 地址 |
内容 |
实际作用 |
0x406208 等 |
admin123 / r3v3rs3! / password |
踩中会 int3,不是成功 |
0x406268 等 |
三条「开发者注释」 |
诱饵 |
0x4061F0 |
n0_4i_c4n_r34d_th1s! |
诱饵 |
| 门 |
留下什么 |
要比的值 |
| 全部异或 |
1 个字节 |
0x8F |
| 滚动乘加 |
低 16 位(2 个字节) |
0xBEFF |
| 地址 |
干什么 |
0x403D90 |
主函数 |
0x403F75 / 0x403F81 |
输入缓冲;调用 gets_s |
0x402100 |
hex → 大整数 |
0x402A70 / 0x402D70 |
按下标对照表取一份 |
0x404092 |
和 88 比较 |
0x4041BC |
异或和 0x8F 比较 |
0x40425F |
校验和和 0xBEFF 比较 |
0x403500 / 0x402510 |
后 16 字节模幂 |
0x404870 |
S[b-1] |
0x416380 |
欢迎语 |
0x4163B0 / 0x4263B0 |
查表的对照 / 数据 |
323C47184B0D3C44254B445842552F365C362C1144424B0D3C4416433B0DD6B12A0D3D95FA65B5E0ADE5E11B
你输入 88 个 0-9A-F
│
▼
收成 44 字节,记为 K
│
├─ 44 字节全部异或 == 0x8F
├─ 滚动乘加的低 16 位 == 0xBEFF
│
├─ 前 28 字节原样留下
└─ 后 16 字节做:Y^65537 mod n
│
▼
拼成「覆盖后块」= 前28 + 模幂结果
│
▼
每个字节 b,查表 S[b-1]
│
▼
必须等于
Welcome to KCTF2026! Come and give it a try.
结果 = 0x00
结果 = 结果 ⊕ K[0]
结果 = 结果 ⊕ K[1]
…
结果 = 结果 ⊕ K[43]
必须等于 0x8F
0x00 ⊕ 0x32 = 0x32
0x32 ⊕ 0x3C = 0x0E
0x0E ⊕ 0x47 = 0x49
乘数 = (acc 目前最低 7 个比特) + 1
acc = acc + b × 乘数
起步 acc=0,乘数=0+1=1
K[0]=0x32:acc = 0 + 0x32×1 = 0x32 低16位 0032
K[1]=0x3C:乘数=0x32+1=51
acc = 0x32 + 0x3C×51 = 0xC26 低16位 0C26
K[2]=0x47:乘数=0x26+1=39
acc = 0xC26 + 0x47×39 = 0x16F7 低16位 16F7
e = 0x10001 = 65537 (表:0x434018 → 数据 0x430018)
n = 0x8C91CB79EC693F3ED6519C945DD67371
(4 份,对照表 0x42E018,数据区 0x436018)
覆盖后块 = K[0..27] + (Y^e mod n)
p = 0xBD3D59FAC7CC547B
q = 0xBE28EF96C8318203
d = 0x721A022D849DE5CC5AD9BBB701F9FB65
覆盖后块 =
323C47184B0D3C44254B445842552F365C362C1144424B0D3C441643
0F4439374E3C44372544164425151D1B
Y =
3B0DD6B12A0D3D95FA65B5E0ADE5E11B
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。
最后于 9小时前
被教教我吧~编辑
,原因: