首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
CTF对抗
发新帖
0
2
[原创]看雪·2025 KCTF 第十题 WriteUP
发表于: 2025-9-4 12:14
11310
[原创]看雪·2025 KCTF 第十题 WriteUP
DNLINYJ
2025-9-4 12:14
11310
# 前言 LLM 还是有极限的,还是人脑子好使(虽然高考完三个月脑子就没动过 导致好久才转过来弯 悲 # 1. 分析 先用错误的 Flag 试一遍,看下程序输出  拉进 IDA,发现这些字符串并不存在,那就直接拉进 x64dbg,在输入 flag 前按下暂停,从堆栈找 `mainFunc (0x140057A20)`  通过对 `mainFunc (0x140057A20)` 伪代码 switch-case 结构的分析,得到下面的操作流程 ``` [EnterPoint] | (0) 预处理+打印提示 | (1) ? | a1+4708 > 41 (2/3) 判断器 ───────────────> (4) 根据 a1 + 4576 的大小来决定输出 Wrong! / Correct! | | a1+4708 < 41 └────────┐ | (5) 将用户输入映射为只有 0x2/0x3 的数组 | v +-------------------------+ | 数组处理 | | (6) → (8) → (7) | +-------------------------+ | v (9) check | └─────────────── 回到 (3) ``` 其中,case 5 会在一开始将`a1 + 4580`全部初始化为 `0x2`  然后将用户输入按照每 16 字符一次的顺序,将字符转化为 int (所以 `a1 + 4580` 和 `a1 + 4718` 这两个的大小都是 16 * 8 = 128 byte)  然后根据int对应的二进制将其映射,映射规则为 `0 -> 0x2`, `1 -> 0x3`  这就是一个把整数 a2 按位拆成长度为 a3 的二值序列的函数,且0 位写成字节 2,1 位写成字节 3。它从 LSB→MSB 逐位取模/整除 2,并把结果右对齐写进输出缓冲(索引是 width-1-pos),超出 a3 还剩下非零高位会被当成错误处理(设置特殊的 vtable/类型标记)。伪代码还原如下(变量名照反编译语义化): ``` // out = a1[0] 指向的对象内部数据区;width = a3 memset(out, 0, width); int v = a2; for (int pos = 0; pos <= width-1; ++pos) { int bit = v % 2; out[width-1 - pos] = (bit ? 3 : 2); // 3 表示1,2 表示0 v = v / 2; } if (v != 0) { // 说明 a2 的有效位数 > width,走错误路径/设置特殊类型 } ``` 最后把映射后的值填充到 `a1 + 4580` 和 `a1 + 4718` 中, 我们称这个原始映射为 $p_1$    在经过case 6/8/7后, $p_1$ 会根据一定计算生成最终用于比较的 $p_2$, 而 $p_2$ 的值是不等于 $p_1$ 的  在case 9中,会将 $p_2$ 与预定好的 `byte_1400C89D0` 比较,如果比较结果 `a1 + 4576` 大于等于42,那么在case 4就会输出`Correct!`,反之输出 `Wrong!` (从 `a1 + 4576` 也可以看出 Flag 长度应该为 42)  同时 case 3 -> case 5 -> case 6/8/7 -> case 9 -> case 3 的这个循环一共会经历三次,这个三次循环是由 `a1 + 4708` 决定的,而 `a1 + 4708` 由 case 9 赋值,可以得到 `a1 + 4708` 的变换为 0 -> 16 -> 32 -> 48 (跳入 case 4)   # 2. 调试+撞墙 在经历了12小时逆不出来 $p_1$ 到 $p_2$ 的算法之后,我人已经麻了(╬▔皿▔)╯ 后来想了一下,有人能够1h就做出来,绝壁有简单的解法 在推 `mainFunc` 逻辑的时候,我猜想 $p_1$ 到 $p_2$ 的算法会不会是可逆的(不要管旁边那个 Yes, 那是做出来之后写的【】) (另外是byte不是bit,半夜脑子不清楚了)  于是我将 `byte_1400C89D0` 导出,用 Python 分割为 128 byte 的三个片段,在 x64dbg 动调的时候把 `a1 + 4580` 里面的映射替换掉  在 x64dbg 里面选中内存,Ctrl+E 进入编辑页面,将片段直接粘贴保存   最后在 case 9 dump这段 $p_1$ 对应的 $p_2$  (上为 $p_1$,下为 $p_2$)  最后将 $p_2$ 转化为字符串,得到 Flag   于是我们也可以得到一个结论,即 $p_1$ 到 $p_2$ 是可逆的,可以从已知的 $p_2$ 倒退回用户输入的 $p_1$ 最后可得到 Flag 为 `KCTF{84e3229c-310b-4a9b-9977-b20db689d701}` # 3. 总结 中间有几道题没做是因为偷懒了,也没进前 10(我的T恤啊啊啊啊啊啊啊 (首)
登录后可查看完整内容
传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!!
收藏
・
0
点赞
・
2
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
wx_晨梦
感谢你的贡献,论坛因你而更加精彩!
2026-7-16 08:48
Ally Switch
+1
非常支持你的观点!
2025-9-4 14:11
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
2
)
TurkeybraNC
雪 币:
3488
活跃值:
(3098)
能力值:
( LV6,RANK:90 )
在线值:
发帖
15
回帖
35
粉丝
43
关注
私信
TurkeybraNC
2
楼
弱弱问一句,你的Terminal背景是AB的那张立华奏和仲春由理的图吗
2025-10-2 19:59
0
DNLINYJ
雪 币:
2510
活跃值:
(1241)
能力值:
( LV8,RANK:129 )
在线值:
发帖
12
回帖
8
粉丝
15
关注
私信
DNLINYJ
3
楼
TurkeybraNC
弱弱问一句,你的Terminal背景是AB的那张立华奏和仲春由理的图吗
是的 :)
2025-10-2 23:02
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
DNLINYJ
12
发帖
8
回帖
129
RANK
关注
私信
他的文章
[原创] 看雪·2026 KCTF 第九题:丑寅同墟·星海抉择 WP (AI)
495
[原创] 看雪·2026 KCTF 第十题:卯时·曦光初现 WP (AI)
1478
[原创]看雪·2026 KCTF 第七题:戌时·暗能潜流 WP (AI)
32
[原创] 看雪·2026 KCTF 第四题:未时·车流困城 WP
112
[原创]看雪·2026 KCTF 第五题:申时·忆海倒带 WP (AI)
68
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部