腾讯游戏安全2024初赛-PC-WriteUp

image-20240413220329788

可以看到题目说的是有一个exe和一个sys两个pe文件,答案是两个token,那么可以大胆的猜测是R0层一个,R3层一个

因为自己从R0层开始分析的,所以这里分析的过程也从R0层开始

Ring0 Token

PS:这里自己有个很大的坑,搞了很久才知道,题目中(关闭windows defender等杀软后,先运行exe后需自行加载sys驱动,驱动加载返回值为31则驱动加载成功。此时,程序会写入两段shellcode到内存中)这个位置我双击调试的时候,因为没有很耐心的等待sys驱动加载完,立刻断下来开始搞的导致无法出现蓝屏的情况,这个问题搞了很久(所以这里要注意一下)

R3程序启动后,R0程序启动后,R0返回值为0x31,这个一般不是一个正确的返回值

image-20240413222621860

这个时候打开其他的调试工具的时候,会发生蓝屏的现象,蓝屏的错误代码 0xace image-20240413222225261

根据这个想法来说的话,在驱动加载后返回0x31的情况下,进行了一个检测,并且导致蓝屏,那么很好的可以猜到很可能是起了一个内核线程,直接断PsCreateSystemThread (然后经过漫长的等待,因为驱动加了vmp跑的很慢)

这时候断下后发现这个地址有点不太对劲

image-20240413222955941

直接uf看一下这个地址,这里能看到这个0xACE的值,和上面一堆的xmm的操作,并且这个位置是无模块的,直接dump下来看看是什么 image-20240413223110769

直接丢在idaf5看一下

image-20240413223358614

这里做了一些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地址过来看看是什么东西

image-20240413224312404

可以发现是DbgPrintEx,但是如果想在调试器中输出需要把该函数的level改了

NTSYSAPI ULONG DbgPrintEx(
  [in] ULONG ComponentId,
  [in] ULONG Level,
  [in] PCSTR Format,
       ...   
);

直接把Level修改成0

image-20240413225828554

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的操作?

image-20240413231409602

其实看这个ring3vm还有点久(并没有看出什么东西,差点绕进去了)想了一下不如procmon直接干看一下task进程里的shellcode做了什么事情

image-20240413231801279

可以发现是CreateFile Name Not Found,这个估计又是和上面一样的思路,上面是dbgprintex参数的问题,直接用ida看一下,我们现在可以确定创建一个C:\2024GameSafeRace.token1就可以看到token

image-20240413232008992

可以看到token,这个时候我们看一下什么操作导致的

image-20240413232141361

_RBP + 96 : fileName,问题出在了 v13 = 3 (OPEN_EXISTING)修改成 OPEN_ALWAYS即可

得出的答案就是:flag{757F4749AEBB1891EF5AC2A9B5439CEA- 8b3f14a24d64f3e697957c252e3a5686}