腾讯游戏安全2024初赛-PC-WriteUp
可以看到题目说的是有一个exe
和一个sys
两个pe
文件,答案是两个token
,那么可以大胆的猜测是R0
层一个,R3
层一个
因为自己从R0
层开始分析的,所以这里分析的过程也从R0
层开始
Ring0 Token
PS:这里自己有个很大的坑,搞了很久才知道,题目中(关闭windows defender等杀软后,先运行exe后需自行加载sys驱动,驱动加载返回值为31则驱动加载成功。此时,程序会写入两段shellcode到内存中)这个位置我双击调试的时候,因为没有很耐心的等待sys驱动加载完,立刻断下来开始搞的导致无法出现蓝屏的情况,这个问题搞了很久(所以这里要注意一下)
在R3
程序启动后,R0
程序启动后,R0
返回值为0x31
,这个一般不是一个正确的返回值
这个时候打开其他的调试工具的时候,会发生蓝屏的现象,蓝屏的错误代码 0xace
根据这个想法来说的话,在驱动加载后返回0x31
的情况下,进行了一个检测,并且导致蓝屏,那么很好的可以猜到很可能是起了一个内核线程,直接断PsCreateSystemThread
(然后经过漫长的等待,因为驱动加了vmp跑的很慢)
这时候断下后发现这个地址有点不太对劲
直接uf
看一下这个地址,这里能看到这个0xACE
的值,和上面一堆的xmm
的操作,并且这个位置是无模块的,直接dump
下来看看是什么
直接丢在ida
里f5
看一下
这里做了一些xor的操作,我是进行了解密
import numpy as np
v7 = np.array([0x4B6D1DDD324B10F0, 0x1E336B548B32934E], dtype=np.uint64)
v10 = np.array([0x4B6D1DDD4A7920D5, 0x1E336B548B32934E], dtype=np.uint64)
v7_xor = np.bitwise_xor(v7, v10)
result_hex = [hex(value) for value in v7_xor]
print(result_hex)
解密出来的是token:
, %02x
这种东西,这里还是一个while(1)
,所以直接bp
地址过来看看是什么东西
可以发现是DbgPrintEx
,但是如果想在调试器中输出需要把该函数的level
改了
NTSYSAPI ULONG DbgPrintEx(
[in] ULONG ComponentId,
[in] ULONG Level,
[in] PCSTR Format,
...
);
直接把Level
修改成0
token:8b3f14a24d64f3e697957c252e3a5686
这个题也可以直接用winark
(https://github.com/BeneficialCode/WinArk)去做,直接看一下system
的线程看看有没有奇怪的地址,直接dump
即可
Ring3 Token
R3
程序,主要进行了远线程注入,这里直接hook WriteProcessMemory
这个时候会发现有四个地方写入
Process 25492, lpBaseAddress 00000213AFFA0000, lpBuffer 00007FF689274DA0 Size 1420
Process 25492, lpBaseAddress 00000213AFFA058C, lpBuffer 0000029A6C45C060 Size 4506624
Process 25492, lpBaseAddress 00000213B03EC98C, lpBuffer 000000EC6B2FF140 Size 552
Process 1956, lpBaseAddress 0000004D09CCEAD0, lpBuffer 000000EC6B2FFAA0 Size 4
这里的Size 4
设置了标志位,来跟Ring 0
层进行Check
,这个也就是为什么我们在打开一次黑名单中的调试器的时候,会导致下一次直接报出查询到了,以及Ring 0
层检测后进行了蓝屏的原因
那么主要的大小还是这个Size
比较大的地方,直接dump
下来看看,发现有很多关于file
的操作?
其实看这个ring3
的vm
还有点久(并没有看出什么东西,差点绕进去了)想了一下不如procmon
直接干看一下task
进程里的shellcode做了什么事情
可以发现是CreateFile Name Not Found
,这个估计又是和上面一样的思路,上面是dbgprintex
参数的问题,直接用ida
看一下,我们现在可以确定创建一个C:\2024GameSafeRace.token1
就可以看到token
啦
可以看到token
,这个时候我们看一下什么操作导致的
_RBP + 96 : fileName
,问题出在了 v13 = 3 (OPEN_EXISTING)
修改成 OPEN_ALWAYS
即可
得出的答案就是:flag{757F4749AEBB1891EF5AC2A9B5439CEA- 8b3f14a24d64f3e697957c252e3a5686}