腾讯游戏安全2024初赛-PC-WriteUp
感谢宝子们对我的帮助!
特别感谢!存宝!翔哥!呜呜呜呜!
WP是简单的版本,因为做题的时候是远程好盆友的电脑,自己没有windows环境,所以代码和截图说明就没有那么多了,就简单版本!希望大家不要喷我!我就是记录一下!存个档!

可以看到题目说的是有一个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的操作,我是进行了解密
1 2 3 4 5 6 7 8 9 | import numpy as npv7 = 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改了
1 2 3 4 5 6 | 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
这个时候会发现有四个地方写入
1 2 3 4 | Process 25492, lpBaseAddress 00000213AFFA0000, lpBuffer 00007FF689274DA0 Size 1420Process 25492, lpBaseAddress 00000213AFFA058C, lpBuffer 0000029A6C45C060 Size 4506624Process 25492, lpBaseAddress 00000213B03EC98C, lpBuffer 000000EC6B2FF140 Size 552Process 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}