腾讯游戏安全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 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
改了
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 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}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2024-4-15 18:57
被L0x1c编辑
,原因: