前言:决赛打完,我还是孤陋寡闻了,判断出HYPER-V被劫持,但是不知道怎么题目是怎么实现的,我内核驱动遍历页表都读不出HYPER-V的内存(EFI的hv不会向Windows映射这段内存),想不通怎么从GUEST读到HOST内存(后面想明白应该在虚拟机里做这个题,可以直接秒杀),DDMA都没看出来,只做了一半,还是得好好沉淀好好学习。
这个初赛WrtiteUP是提交上去的版本稍微润色,第一次参加CTF,思路可能有不足,题解仅代表我自己的思路。
0. 题目总体分析与解题思路打开压缩包一看,上来就是内核驱动。一个 4M VM 混淆的 sys,旁边站着一个体积还没它大的控制台程序。R3 发指令、驱动做读写。
本题核心考点:检测 IOCTL (我觉得对于写外挂,IOCTL通信是很原始的做法,真实反作弊会在IOCTL相关函数注册回调)
程序跑起来之后,老老实实告诉了我一切: 图 0-1: ShadowGateApp 运行界面 —— 题目把规则说得明明白白关键信息提取:
· 驱动里藏了个 13×13 的加密迷阵,入口 (0,0),出口 (12,12)
· "The palace gives NO feedback" —— 表面上不给任何移动结果反馈
· "Five hidden flaws betray the result of every move" —— 但存在 5 个隐藏的信息泄露缺陷
· 每次 RESET 后,前 5 步成功移动依次暴露一种缺陷
· 终极目标:找到最短路径,走到终点提取内网凭证(Flag)题目的核心设计:驱动核心逻辑被 VMP保护,选手只能看到接口和调用规则。在"黑盒"条件下,通过分析 5 条侧信道来摸清迷宫布局,最终提取 Flag。但文件到了选手的电脑上,自然是各显神通。除了题目设计的纯侧信道路线外,直读内核内存(甚至直接 kdmapper 加载一个读写驱动都行)、DMA(遍历 PTE 页表读物理内存)、池标签搜索……都可以直接拿到迷宫真值。路线 A — 纯传统逆向 + 侧信道探测:
IDA 逆向 IOCTL 协议 → 导入表发现 5 种侧信道 → 编写检测脚本 → EXIT_MARKER 验证法精确探测 → DFS探索地图+最短路径 → 取 Flag路线 B — 自研 Hypervisor 牛刀杀鸡直接读内存:
Hypervisor → 读驱动 g_MazeContext 内核内存(实际上这一步既读了完整的地图,也读了最短路线)→ 把读出来的编码转换成地图(0=通道,1=墙)→ 输出完整 13×13 精确地图准确地说它的名字叫 HyperRay。稍后有一个AI用MCP调用它的示例,简要介绍它的架构:
整套工具解耦设计,模块化开发。驱动通过 WSK 网络栈通信(以原生支持双机调试),GUI 通过 DLL 后端抽象层连接。MCP 层让 AI 可以直接调用 VT 调试器的全部能力 , 包括本次比赛中用到的内核内存读取。
这个调试器过几天会开源,请关注后续看雪发帖拿到驱动文件 ShadowGateSys.sys,甚至都没有签名,只好掏出我压箱底的过期EV签,给他签上加载了。 (常规操作应该是测试签+测试模式)
sc create + sc start 一步到位
sc create ShadowGate type=kernel binPath=C:\ShadowGateSys.syssc start ShadowGateIDA 打开 EXE,先看它怎么连驱动的。在 main 附近很快找到 CreateFileW 调用: 图 1-2: IDA 中 EXE 的 CreateFileW —— 打开 \\.\ShadowGate代码里连提示都帮你写好了:驱动没加载就告诉你用 sc create,权限不够就告诉你 Run as Administrator。出题人很贴心。IDA 打开 sys,直奔 DriverEntry。位于 INIT 段,没被 VMP 保护——VMP不保护 INIT 段,因为系统初始化完成后这段内存会被释放
图 1-3: DriverEntry —— IoCreateDevice + IoCreateSymbolicLinkDriverEntry 做了几件事:
1. ExAllocatePool2 分配迷宫上下文(后面详说)
2. 调用 MazeInit() 初始化迷宫(在 VMProtect 段内,看不到细节)
3. IoCreateDevice 创建 \Device\ShadowGate
4. IoCreateSymbolicLink 创建符号链接 \??\ShadowGate
5. 注册 IRP handler:CREATE / CLOSE / DEVICE_CONTROL对于 VMP保护的驱动,大部分时候可以从导入表入手。IAT 必须保留明文函数指针,VMP 拿它没办法。翻一遍导入表,几乎所有侧信道的函数签名都暴露了: 图 1-4: 导入表全貌 —— ntoskrnl 导入函数列表
导入表一读完,心里就有数了:5 个侧信道对应 5 组可疑的 API 调用。接下来只需要对每个 API 做交叉引用(XREF),找到调用点,看看具体怎么用的。这个调用值得单独拿出来说。导入表的 ExAllocatePool2 XREF 指向 DriverEntry:
图 1-5: ExAllocatePool2(64, 472, 0x657A614D)参数拆解:
· 64 = POOL_FLAG_NON_PAGED
· 472 = 0x1D8 字节 = 迷宫上下文结构体大小
· 1702519117 = 0x657A614D = ASCII 'Maze'(池标签)
13×13 = 169 字节迷宫 + 3 字节对齐 = 172 字节在上下文头部,剩余 300 字节存坐标、状态、计数器等。
返回值存入 .data 段全局变量,偏移 0x50B8 —— 这就是 VT 路线的定位点。IrpDeviceControl 入口虽然跳到 VMProtect thunk,但 switch-case 框架还是看得到三个码:
图 1-6: IOCTL 分发 —— 三码 switch-case
...(已截断)
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-290937.htm
[原创]2026腾讯游戏安全技术竞赛 初赛 直读内存拿明文地图
222 浏览
4 回复
你好,初赛的题可以给一份吗
mb_soqpzdaf
你好,初赛的题可以给一份吗
官网可以下载
你好,初赛的题可以给一份吗
官网可以下载
XieCZ1337
官网可以下载
现在不让下载了
官网可以下载
现在不让下载了
期待后续