【2020腾讯游戏安全技术竞赛】PC方向初赛 WriteUp

很遗憾没有进入复赛,不过还是记录一下自己做题的过程叭
PC方向的初赛题目有2道,一道Ring0一道Ring3,由于技术不到位 我只做了简单的Ring3,无缘复赛QAQ
RIng0的题目为:给了一个加了vmp壳的驱动,该驱动无法正常加载,要求在不修改驱动文件的情况下尝试让驱动成功加载,并设法让驱动成功执行print
Ring3的题目为:给了一个扫雷exe和一份dmp文件,要求通过分析得出外挂修改了程序的哪些地方、实现了什么功能

首先拿到winmine.exe于winmine.dmp

尝试windbg加载dmp文件,指定image file为exe,输入指令 !analyze -v ,分析得到结果,崩溃是由int3指令产生(不过这并不重要,重要的是内存转储文件中的程序数据)

使用exepeinfo查看该exe的pe结构,找到text段偏移和大小

使用winhex打开exe文件,将其text段裁剪下来,在这里我采用了text段偏移的基础上再加0x1d4的偏移,故裁剪后得到的文件大小为0x3a2c字节

再使用winhex打开dmp文件,根据特征码搜索定位到text段被映射到的地址偏移,采用同样的方法将0x3a2c大小的块裁剪下来

分析比对2个裁剪后的文件的不同

可以发现,有6个字节的代码被填充为了nop,在IDA上找到该处代码

可以发现,该外挂将inc dword_100579c这条命令跳过了

在Windows消息循环中有一个sub_1002fe0函数,这条被nop的命令就在该函数中,该函数会将dword_100579c与999进行比较,如果小于999,则自增dword_100579c

根据进一步调试,我确定了这是与计时有关的函数,恰好扫雷的时间显示框只能容纳3位数(最高表示数999),自增命令被nop后扫雷的计时功能将停止,数字不会随着时间递增,时间会永远显示为001

第二个被修改的指令为push 0,被修改后的代码为jmp short loc_10035b0,也就是直接跳转至函数尾

正常的执行流程为

而修改后代码的第18行的call sub_100347c(0)没有被执行,该函数的作用是点到雷后的逻辑操作,不执行该函数相当于点到雷以后游戏并不会结束,依然可以继续扫雷

综上所述,该外挂通过patch了2处代码实现了如下功能:

(1)时间锁定为001

FF 05 9C 57 00 01 → 90 90 90 90 90 90

(2)点到雷以后游戏并不会结束

6A 00 → EB 1D

不敢说这是正确答案,只能说是我的解题报告,不足之处还望各位师傅斧正

发布了30 篇原创文章 · 获赞 9 · 访问量 7382

猜你喜欢

转载自blog.csdn.net/tqydyqt/article/details/105497000