-
-
[原创]2026 年腾讯游戏安全初赛 PC方向
-
发表于: 3小时前 55
-
注:本人草台班子出身属于是那种可以整出效果但是文章过程一坨的 这里文章还要让ai帮我润色的,看了论坛大佬的文章也发现了一堆丢分的点只能说下次努力吧 ,答案以官方公布为准
1. 开局先摸题这题第一眼看题面就知道不是单纯的用户态程序,真正有东西的是 `ShadowGateSys.sys`,而 `ShadowGateApp.exe` 更像一个控制台壳子,负责发指令、接回包、展示结果。
先从题面和字符串把外轮廓摸出来。很快能确定三个关键信息:
一是设备名是 `\\.\\ShadowGate`;二是控制台会创建多组命名 Event / Semaphore;三是初始化 IOCTL 会返回迷宫尺寸和起终点坐标。
2. 先把协议抓出来因为驱动混淆挺重,直接静态啃 DeviceIoControl 分支会很慢,所以先用 Frida 把 App 挂起来,把 `CreateFileW / CreateEventW / CreateSemaphoreW / DeviceIoControl` 全部打一遍日志。(这里就是第一个丢分点了连驱动都没有加载,直接就是用户态 hook 抓协议,然后离线模拟驱动逻辑直接恢复了迷宫和最终 flag)
这样做的好处是非常直接:哪几个对象被创建了、IOCTL 号是多少、初始化回包长什么样,一眼就能看出来。
最终抓到的核心协议是:`0x8001200C` 为初始化,`0x80012004` 为移动,`0x80012008` 为 reset。初始化返回 24 字节,也就是 6 个 `uint32`。真正的迷宫不是 16x16,而是 13x13,终点在 `(12,12)`。

图 1 协议抓取与初始化回包解析
3. 五种隐藏泄漏怎么定位题面说得很抽象,说系统表面没反馈,但每次 reset 后前五次成功移动会按固定顺序暴露五种漏洞。这个描述其实已经很像引导了:说明泄漏不是随机的,而是状态机。
先在用户态日志里把对象名字收集出来,再配合驱动模拟,把 move 分支一层层跑通。最后确认的五类泄漏顺序如下:
1. Event 泄漏;2.Semaphore 泄漏;3.TEB 写入泄漏;4.TEB/线程上下文读探测;5.PEB 读探测。
这里最坑的一点是,后面三类已经不是简单对象信号了,而是 attach 到用户进程后对 TEB / PEB 做读写,所以如果只盯着事件对象会漏掉一大半。

图 2 reset 后前五次成功移动对应的五类泄漏
4. 迷宫怎么还原这题真正难的是混淆,不是业务逻辑本身。把导入和几个时间种子 helper stub 掉以后,DriverEntry 和 DeviceIoControl 就能在用户态里跑起来。
驱动初始化完成之后,会在全局状态块前 169 个字节里留下一个 13x13 的二值网格。把它按行展开以后,`.` 代表可走,`#` 代表墙,完整迷宫就是文档里的截图。
这样子到这一步题目已经从『逆向 + 隐蔽泄漏』变成了一个标准最短路问题,剩下直接 BFS 不就解决了(对的我当时想的就是这么简单
)。

图 3 还原出的 13x13 迷宫与最短路径
5. 最短路和最终 flag对迷宫做 BFS 后,最短路径长度是 `32`,路径串是 `DDDDDDSSDDDDWWDDSSSSSSSSAASSSSDD`。
当这条路径完整送进驱动以后,最后一次 move 的回包尾部会出现 `!NIW` 开头的字样。这个地方其实是在提示 `WIN!`,只是写进缓冲区时顺序反了一下。
继续从偏移 0x40 往后解,最后拿到的字符串就是 `flag{SHAD0WNT_HYPERVMX}`。

图 4 终点回包与 flag 解码
关键结论初始化回包:`0d000000 0d000000 00000000 00000000 0c000000 0c000000`
最短路径:`DDDDDDSSDDDDWWDDSSSSSSSSAASSSSDD`
最终 flag:`flag{SHAD0WNT_HYPERVMX}`


)。
