2025腾讯游戏安全初赛复现
前置准备
因为驱动没有数字签名直接运行不行,我是把强制驱动签名关掉了
静态分析ACEFirstRound.exe
驱动加载
a1+8()函数里面为
通过这个加载驱动
最终通过这个FilterSendMessage向驱动发送数据,驱动进行验证
r3层动调
直接调试时,有两个地方要注意,一个是r3层的反调试,一个是驱动对进程的权限提升,导致调试器调试不了
r3层反调试在这里
创建了个线程进行反调试
把这个nop掉就能过了
然后是驱动对进程的进程的权限提升
ida附加不上
听别的师傅说xdbg好用点有反反调试插件,直接能跑,哎,我是废物,没有插件qwq
其实这个问题也好解决,两个方法
第一个就是nop掉加载驱动的函数,就只先分析r3层的
第二就是找到内核提升权限的标志位,改成普通的就行
说下第二个怎么弄
进入windbg本机附加内核,程序起起来
重点在
具体结构类型在下面
在驱动里面是这样写的(在驱动的导入函数里找到PsGetCurrentThreadProcessId向上找到调用就找到了)
当前数值为0x62,type为0y010就是处于保护状态
直接修改其值为0就行
改完后就可以正常附加了
接下来就是愉快的调试分析了
比较了长度范围和前几个字符为’ACE_’
base58
表
然后又加个@,在逆序
在异或sxx
最后向驱动发送数据
r0层静态
静态分析驱动有好多花
去除掉即可
找到
这个下面会用到
这里就是驱动加密的地方
但是直接解密就错了
驱动对tea加密进行了inlinehook
r0层动态
windbg进行双机调试
通过bu ACEDriver!DriverEntry设置预加载断点,在加载驱动时断下
在上面我们发现传入驱动时
我们windbg断点下在这里
在往下跟跟
看这两个参数
我们发现这个参数就是程序传入驱动的数据和大小
接着跟进
tea分成了四段
但是第三段其实就是第一段的后半部分,所以我们把这段内存dump出来
用windbg这个命令
1 | .writemem C:\dump.bin fffff803`8c631000 L95 |
后面的参数是dump的位置 起始地址 大小
合并下再放入ida里改下跳转
得到真正的加密
密文再驱动里能直接看到
解密脚本
1 | #include<stdio.h> |
所以flag为ACE_We1C0me!T0Z0Z5GamESecur1t9*CTf
小结
哎,最简单的一年,可惜了,我太菜了qwq
当时比赛时确实什么都不会,第一次做有关内核的,比赛只想着怎么动调了,静态也没怎么看,看别的师傅直接静态出了,tql,我数字签名搞了一天,哎qwq