首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
CTF对抗
发新帖
0
6
[原创]第五题「申时·忆海倒带」解析
发表于: 2026-8-19 09:42
1256
[原创]第五题「申时·忆海倒带」解析
教教我吧~
1
2026-8-19 09:42
1256
样本:`cm.exe`(官方 SHA1:`d1c8124c5964af1531c6e311328854a05ca40bca`) 成功:输入一串字符,回车后打印 `verify success.` 详细逐步稿见附件 `第五题「申时·忆海倒带」详细版.md`。本文只当地图:先看整条路,再按需翻细稿。 --- ## 1. 答案 ``` 323C47184B0D3C44254B445842552F365C362C1144424B0D3C4416433B0DD6B12A0D3D95FA65B5E0ADE5E11B ``` 88 个十六进制字符 = 44 个字节。 --- ## 2. 整条路(先看这张) ``` 你输入 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. ``` 倒着求:欢迎语 → 反查 S 得到覆盖后块 → 前 28 直接当 K 的头 → 后 16 做反向模幂得到 K 的尾。 --- ## 3. 不要走的岔路 这些字符串程序里都有,但不是成功输入: | 地址 | 内容 | 实际作用 | | ------------- | ------------------------------------ | ----------------------- | | `0x406208` 等 | `admin123` / `r3v3rs3!` / `password` | 踩中会 `int3`,不是成功 | | `0x406268` 等 | 三条「开发者注释」 | 诱饵 | | `0x4061F0` | `n0_4i_c4n_r34d_th1s!` | 诱饵 | 主函数在 `0x403D90`。提示句 `0x40622C`,失败句 `0x406240`,成功句 `0x406258`。 --- ## 4. 正向:程序检查什么 ### 4.1 外形 - 必须正好能对应 **11 份 × 每份 8 个十六进制字符 = 88**。 - 88 写死在 `0x404092`:`cmp edx, 0x58`(`0x58` = 88)。 - `edx` 来自 `0x40405D`:`lea edx, [eax*8]`,即「份数 × 8」。 - 每个字符只能是 `0-9` 或大写 `A-Z`。小写 `a-z` 会被刷掉。 ### 4.2 收成 44 字节 - `0x402100`:从左到右,每读一个字符,当前值 × 16 再加 0..15。 - 11 个 4 字节整数,按下标对照表存放,再从高到低写回,得到 **K[0..43]**。 ### 4.3 两道算术门(针对整份 K) 两道门都只检查同一串 44 字节 K,不算欢迎语。对不上就直接失败。 **门 A:44 字节全部异或,结果必须是 `0x8F`** 异或:两个比特相同得 0、不同得 1。一个字节 8 位,就 8 位各自做一次。 从 `0x00` 起,按顺序和每一个 K 字节异或,最后剩下 1 个字节: ``` 结果 = 0x00 结果 = 结果 ⊕ K[0] 结果 = 结果 ⊕ K[1] … 结果 = 结果 ⊕ K[43] 必须等于 0x8F ``` 用 K 开头三个真实字节核对算法: ``` 0x00 ⊕ 0x32 = 0x32 0x32 ⊕ 0x3C = 0x0E 0x0E ⊕ 0x47 = 0x49 ``` 代码:`0x4041BC cmp al, 0x8F` **门 B:滚动乘加,只看低 16 位,必须是 `0xBEFF`** 再扫同一串 K。准备整数 `acc`,从 0 起。每来一个字节 `b`: ``` 乘数 = (acc 目前最低 7 个比特) + 1 acc = acc + b × 乘数 ``` 「最低 7 比特」= `acc` 除以 128 的余数,范围 0~127。 「滚动」= 这一步的乘数用的是上一步加完的 `acc`,改中间任一字节,后面全变。 「低 16 位」= `acc` 可以很大,比较时只看最右边 4 个十六进制位。例如 `0x0006BEFF` 的低 16 位是 `0xBEFF`。 用 K 开头三个真实字节核对算法: ``` 起步 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 ``` 44 步走完,低 16 位必须是 `0xBEFF`。 代码:`0x40425F mov eax, 0xBEFF`,然后只比 `acc` 的低 16 位。 | 门 | 留下什么 | 要比的值 | | -------- | -------------------- | -------- | | 全部异或 | 1 个字节 | `0x8F` | | 滚动乘加 | 低 16 位(2 个字节) | `0xBEFF` | ### 4.4 只对后 16 字节做模幂 - `0x404271`:`edx = 输入缓冲 + 56` → 后 32 个 hex 字符 = 后 16 字节 **Y**。 - `0x403A21` 调用 `0x402510`:`结果 = Y^e mod n`。 ``` e = 0x10001 = 65537 (表:0x434018 → 数据 0x430018) n = 0x8C91CB79EC693F3ED6519C945DD67371 (4 份,对照表 0x42E018,数据区 0x436018) ``` 模幂得到 16 字节,覆盖到 K 的尾部: ``` 覆盖后块 = K[0..27] + (Y^e mod n) ``` ### 4.5 查表后必须等于欢迎语 - 欢迎语在 `0x416380`,正好 44 个字符。 - 每个字节:`0x40450C dec eax` 再 `call 0x404870`,即 **S[b-1]**。 - 表:对照 `0x4163B0`,数据 `0x4263B0`。 - `0x404550`:`mov eax, 0x416380`,和查表结果逐字节比。相同则 `0x404586` 打印成功。 --- ## 5. 反向:怎么求出 K 1. 欢迎语每个字符在 S 表里只出现一次 → 反查下标,再 **+1**,得到覆盖后块 44 字节。 2. 前 28 字节 = **K 的头**。 3. 后 16 字节 = `M` = 模幂结果。 分解 `n = p × q`,算出反向指数 `d`,则 **Y = M^d mod n** = K 的尾。 这一步为什么成立、小数例子、本题如何验算:见 `5_如何求出Y.md`(不要跳过)。 4. `K = 头 + Y`,再代回 4.3 两道门,应得到 `0x8F` 和 `0xBEFF`。 5. 把 K 写成 88 个大写 hex,喂给 `cm.exe`。 ``` p = 0xBD3D59FAC7CC547B q = 0xBE28EF96C8318203 d = 0x721A022D849DE5CC5AD9BBB701F9FB65 覆盖后块 = 323C47184B0D3C44254B445842552F365C362C1144424B0D3C441643 0F4439374E3C44372544164425151D1B Y = 3B0DD6B12A0D3D95FA65B5E0ADE5E11B ``` --- ## 6. 最小地址表 | 地址 | 干什么 | | ----------------------- | ----------------------- | | `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` | 查表的对照 / 数据 | --- ## 7. 建议阅读顺序 1. 先只看本文第 2 节那张图,能复述「88 → 两道门 → 后 16 模幂 → 查表 → 欢迎语」。 2. 某一格看不懂,再去 `2_初学者逐步分析.md` 对应节(外形=第 9 节,异或=第 14 节,模幂=第 18–22 节,查表=第 23–26 节,反推=第 27–30 节)。 3. 要求逐步代入、机器码对照时,用细稿;只要对拍或写脚本,用本文第 1、5 节即可。
回复或点赞可查看完整内容
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。
最后于
2026-8-19 09:43 被教教我吧~编辑 ,原因:
上传的附件:
第五题「申时·忆海倒带」详细版.md
(85.17kb,4次下载)
收藏
・
0
点赞
・
6
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
git_51951meggadf3df
非常支持你的观点!
5天前
mb_dvqqrcce
感谢你的积极参与,期待更多精彩内容!
5天前
晨曦。
为你点赞!
2026-9-9 07:24
mb_lthgjpwj
为你点赞!
2026-8-21 07:30
huangyalei
感谢你的积极参与,期待更多精彩内容!
2026-8-20 15:08
git_53731Amoswish
为你点赞!
2026-8-19 14:20
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
4
)
xingbing
雪 币:
158
活跃值:
(5651)
能力值:
( LV2,RANK:10 )
在线值:
发帖
2
回帖
1373
粉丝
2
关注
私信
xingbing
2
楼
学习
2026-8-19 14:40
0
mb_twxozogd
雪 币:
0
能力值:
( LV1,RANK:0 )
在线值:
发帖
1
回帖
12
粉丝
0
关注
私信
mb_twxozogd
3
楼
666
2026-8-19 17:11
0
mb_shzsxtje
雪 币:
1146
能力值:
( LV1,RANK:0 )
在线值:
发帖
0
回帖
35
粉丝
0
关注
私信
mb_shzsxtje
4
楼
666
2026-8-20 07:57
0
wx_平淡无奇
雪 币:
235
活跃值:
(247)
能力值:
( LV3,RANK:20 )
在线值:
发帖
3
回帖
1
粉丝
0
关注
私信
wx_平淡无奇
5
楼
666
2026-8-20 08:16
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
教教我吧~
1
12
发帖
63
回帖
80
RANK
关注
私信
他的文章
[原创]第九题「丑寅同墟·星海抉择」解析
344
[原创]第八题「亥子合辰·塔影迷楼」解析
36
[原创]第七题「戌时·暗能潜流」解析
21
[原创]第五题「申时·忆海倒带」解析
1256
[原创]第二题「巳时·绿光幽语」解析
681
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
谁下载
×
huangyalei
mb_twxozogd
mb_lthgjpwj
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部