首页
社区
课程
招聘
[原创]第五题「申时·忆海倒带」解析
发表于: 9小时前 205

[原创]第五题「申时·忆海倒带」解析

9小时前
205

样本: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
你输入 880-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
0x000x32 = 0x32
0x320x3C = 0x0E
0x0E0x47 = 0x49
乘数 = (acc 目前最低 7 个比特) + 1
acc  = acc + b × 乘数
起步 acc=0,乘数=0+1=1
K[0]=0x32:acc = 0 + 0x32×1     = 0x3216位 0032
K[1]=0x3C:乘数=0x32+1=51
           acc = 0x32 + 0x3C×51 = 0xC2616位 0C26
K[2]=0x47:乘数=0x26+1=39
           acc = 0xC26 + 0x47×39 = 0x16F716位 16F7
e = 0x10001 = 65537          (表:0x434018 → 数据 0x430018)
n = 0x8C91CB79EC693F3ED6519C945DD673714 份,对照表 0x42E018,数据区 0x436018
覆盖后块 = K[0..27] + (Y^e mod n)
p = 0xBD3D59FAC7CC547B
q = 0xBE28EF96C8318203
d = 0x721A022D849DE5CC5AD9BBB701F9FB65

覆盖后块 =
  323C47184B0D3C44254B445842552F365C362C1144424B0D3C441643
  0F4439374E3C44372544164425151D1B

Y =
  3B0DD6B12A0D3D95FA65B5E0ADE5E11B

冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

最后于 9小时前 被教教我吧~编辑 ,原因:
上传的附件:
收藏
免费 1
打赏
分享
最新回复 (2)
雪    币: 158
活跃值: (5416)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习
4小时前
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
666
1小时前
0
游客
登录 | 注册 方可回帖
返回