目录
一、 成功加载驱动并与之正确通信,理解题目基本机制
1.1 题目基本机制
1.2 驱动加载
二、隐匿通信手段总结
2.1 命名事件泄漏
2.2 命名信号量泄漏
2.3 TEB 字段泄漏
2.4 句柄属性泄漏
2.5 页属性泄漏
2.6 完整脚本验证
附:详细分析见后文
三、探索迷宫
3.1 驱动端静态分析
3.2 驱动端动态分析
3.3 迷宫地图
四、求解路径
五、 flag
六、详细分析(针对隐蔽通道的分析)
6.1 三环程序静态分析
6.2 三环程序动态分析
6.3 驱动静态分析
6.4 命名事件泄漏
6.5 命名信号量泄漏
6.6 TEB 字段泄漏
6.7 句柄属性泄漏
6.8 页属性泄漏
七、脚本介绍
7.1 监控脚本
7.2 解密脚本
一、 成功加载驱动并与之正确通信,理解 题目基本机制
1.1 题目基本机制
题目提供两个文件:
- `ShadowGateApp.exe`:用户态控制台程序( Ring3 )
- `ShadowGateSys.sys`:内核驱动( Ring0 )
系统由用户态控制台与内核驱动通信,驱动内部隐藏一个加密迷阵。表面上系统不给任何反馈,但存在 5 种隐蔽信息泄露通道。需要:发现泄露通道、还原迷宫、求解最短路径、提取 Flag 。
三环程序启动时打印的 Banner 明确提示:
"The system is not as silent as it seems. Five hidden flaws betray the result of every move... after each reset, the first five successful moves reveal each flaw exactly once, in a fixed order."
即:每次 reset 后,前 5 次成功移动会按固定顺序各触发一次泄漏事件。
1.2 驱动加载
修改系统日期,驱动可以打上过期签名,即可成功加载。
二、 隐匿通信手段总结
动态分析得到关键泄漏操作 API 槽位
2.1 命名事件泄漏
驱动通过 ZwOpenEvent / ZwSetEvent 操作命名事件,将移动结果编码到事件信号中。
2.2 命名信号量泄漏
驱动通过 ObReferenceObjectByName + KeReleaseSemaphore 操作用户态预先创建的命名信号量,将结果编码到信号量计数变化中。
2.3 TEB 字段泄漏
驱动通过 PsGetThreadTeb 获取目标线程的 TEB ,并直接写入 TEB+0x68 ,也就是 LastErrorValue ,从而把结果写入用户态可读字段。
2.4 句柄属性泄漏
驱动读取 TEB+0x1748 中保存的用户态句柄,并调用
ZwSetInformationObject(ObjectHandleFlagInformation) 修改该句柄的 HandleAttributes 。
2.5 页属性泄漏
驱动修改 imagebase+0x5000 页的属性为 PAGE_EXECUTE_READWRITE (0x40)
2.6 完整脚本验证
脚本验证( monitor_shadowgate.py )
五条泄漏的正确判断:
[0001] 23:05:35
rule1 event : OK
[0002] 23:05:36
rule2 sem : A 0->1 (delta=+1) ; B 0->0 (delta=+0)
[0003] 23:05:37
rule3 teb68 : 0x00000000 -> 0xC0DE0001(success)
[0004] 23:05:38
rule4 slot : 0x00000000000000A4 -> 0x00000000000000A4
rule4 attr : attr16=00 00 (none) -> attr16=00 01 (PROTECT_FROM_CLOSE)
[0005] 23:05:39
rule5 prot : 0x00000004 (PAGE_READWRITE) -> 0x00000040 (PAGE_EXECUTE_READWRITE)
五条泄漏的错误判断:
rule1 event : WALL
rule2 sem : A 5->5 (delta=+0) ; B 0->1 (delta=+1)
rule3 teb68 : 0xC0DE0001(success) -> 0xC0DE0000(wall)
rule4 attr : attr16=00 01 (PROTECT_FROM_CLOSE) -> attr16=00 00 (none)
rule5 prot : 0x00000040 (PAGE_EXECUTE_READWRITE) -> 0x00000004 (PAGE_READWRITE)
附:详细分析见后文
三、探索迷宫
3.1 驱动端静态分析
看到了关键信息,申请了页,名为 “ Maze ”,猜测为迷宫存储的具体位置。
3.2 驱动端动态分析
双机验证一下,
Windbg 下断点,
bp nt!PnpCallDriverEntry+0x44
g
加载驱动
bp rax
g
成功到 DriverEntry ,对比 IDA ,成功断下。
对 Pool2 = (void *)ExAllocatePool2(64, 0x1D8, 'ezaM'); 下断点,
成功断下,然后执行单步走, r 看 rax 存储的值,继续执行,打开三环进行通信, windbg 访问内存,得到如下图:
3.3 迷宫地图
00 00 00 00 00 00 00 01 00 00 00 00 00
01 01 01 01 01 01 00 01 01 01 00 01 00
00 00 00 00 00 01 00 00 00 00 00 01 00
00 01 01 01 00 01 01 01 01 01 01 01 00
00 01 00 00 00 00 00 00 00 00 00 01 00
00 01 00 01 00 01 01 01 01 01 00 01 00
00 01 00 01 00 01 00 00 00 01 00 01 00
00 01 00 01 01 01 00 01 00 01 01 01 00
00 01 00 00 00 00 00 01 00 01 00 00 00
00 01 01 01 01 01 01 01 00 01 00 01 01
00 00 00 01 00 00 00 01 00 01 00 01 00
01 01 00 01 00 01 00 01 00 01 00 01 00
00 00 00 00 00 01 00 01 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
四、求解路径
脚本: shortest_path.py
DDDDDD SS DDDD WW DD SSSS SSSS AA SSSS DD
五、 flag
flag{SHAD0WNT_HYPERVMX}
六、详细分析(针对隐蔽通道的分析)
已知前五步,每一步都有一种隐蔽的通信方式,并且拿到了地图和 flag (第三部分)。
6.1 三环程序静态分析
ida_ida.inf_set_auto_enabled(False) ida 停止自动分析
主函数如上图;驱动通信: MessageByEvent();MessageByIO , while 循环,其他基本都是打印。
[培训]《冰与火的战歌:Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。
最后于 2026-4-14 21:53
被h1111编辑
,原因:
上传的附件: