0x00 背景
2018年因为找工作的原因,和同学一起参加过游戏安全竞赛,比赛比较有趣,就一直想再参加一次。2019年为什么不参加?当时已经准备读研了,感觉没有参加的必要,所以今年想着再参加一次。
赛制:分为初赛和决赛
方向:PC、Android、ML、NLP
PC赛题下载
0x01 PC赛题
PC初赛赛题包含两个题,ring0和ring3,分别分析内核态和用户态的程序。ring3题是一道签到题,ring0题需要双机调试(时间不够,没做出来,太菜了)
- ring3 扫雷exe程序和一段内存dump
- ring0 一款有问题的驱动程序
0x02 ring3
1. 题目要求
1 | winmine.exe是一个扫雷游戏程序,winmine.dmp是该程序的一份进程dump, 在这份dump中,winmine.exe的内存映像有指令被篡改,篡改实现了外挂功能。 |
2. 初步分析
- 通过OD打开winmine.exe,定位代码块,冲上往下看到的第一条指令开始地址为0100140C
- 然后用010editor打开winmine.dmp文件,匹配代码开始处二进制“55 8B EC 83 EC 2C 8B 45 08 0F B7 C8 C1 E8 10 89”,找到一处匹配项,将接下来的4000h大小的二进制串(代码块在内存中为4000h)保存下来,用sbulime打开,保存为dump
- 将本机的winmine.exe的内存dump下来,保存为mywinmine.dmp,通过同样的操作,用sublime保存4000H二进制串,保存为mydump
- 用sublime的diff插件比较两块代码的区别,找到代码段四处不同处
- 经过分析,第一处不同是因为我之前设置了断点,所以E8变为CC,排除;第四处不同是由于加入4000H偏移,数据已经进入数据段,排除。现在还剩两处不同
3. 定位不同点
3.1 第一处不同点:
01002FF5处FF 05 9C 57 00 01变为90 90 90 90 90 90,汇编指令inc dword ptr ds:[0x100579C]变为nop
外挂功能:可以让扫雷的计时器停止,永远为1s,此处inc指令代表+1,判断调用了系统dll的时钟函数,用来记录时间,当用nop代替后,时间记录生效。
3.2 第二处不同点:
01003591处6A 00变为EB 1D,汇编指令push 0变为jmp short winmine.010035B0,变化前如下图
变化后,如下图
外挂功能:正常的扫雷,当我们点击到地雷时,本局游戏会结束,然而此处代码通过一个jmp指令,没有调用结束模块,让我们能够继续进行本局游戏,示例图如下
自此,签到题结束
0x03 ring0
1. 题目要求
1 | DriverDemo.sys是一个驱动程序,它内置了一些限制。 |
2. 初步分析
- 设置Windows 10虚拟机高级启动选项,禁用驱动程序强制签名
- 最开始没用管理员权限打开,viewdbg不能捕获内核,google后新建注册项,在下图所示路径新建DWORD=0xf,后来突然想起没给viewdbg管理员权限,给了之后可以捕获内核(可能是管理员权限或者是注册表原因)
- 编写DriverDemo.inf文件,在win10虚拟机下安装DriverDemo.sys
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68[Version]
signature = "$Windows NT$"
;这个是必须的,也可以换成WIndows95 和nT,但是这个最好,它表示windows
Class = NULL ;属于什么类型,这里是没有
ClassGuid = {00000000-0000-0000-0000-000000000000}
;该类型的类型id,这里全填0
Provider = %NULL% ;提供商的名称
DriverVer = 04/01/2020,1.0.0.1 ;驱动的版本号
[DestinationDirs]
DriverDemo.DriverFiles = 12 ;%windir%\system32\drivers
;12代表%windir%\system32\drivers这个目录,意思就是将DriverDemo.DriverFiles中的内容拷贝到%windir%\system32\drivers中
;;
;; Default install sections
;;
[DefaultInstall]
CopyFiles = DriverDemo.DriverFiles
;CopyFiles是内建命令,表示拷贝将等号右边的节里面的文件拷贝到目的地
[DefaultInstall.Services]
AddService = %DriverDemoServiceName%,,DriverDemo.Service
;AddService是内建命令,表示找右边来新建服务.
;%DriverDemoServiceName%这个是服务的名称,加%表示在string section中,DriverDemo.Service代表下面的节点名称
;;
;; Default uninstall sections
;;
[DefaultUninstall]
DelFiles = DriverDemo.DriverFiles
;DelFiles表示卸载时删除文件
[DefaultUninstall.Services]
DelService = DriverDemo,0x200 ; Flags note to stop service first
;删除服务,在删除服务前,先停止服务
;
; Services Section
;
[DriverDemo.Service]
DisplayName = %DriverDemoServiceName% ;系统服务中显示的名称
Description = %DriverDemoServiceDesc% ;系统服务中描述的名称
ServiceBinary = %12%\DriverDemo.sys ;%windir%\system32\drivers\filespy.sys
ServiceType = 1 ;SERVICE_KERNEL_DRIVER
StartType = 3 ;SERVICE_DEMAND_START,手动启动
ErrorControl = 1 ;SERVICE_ERROR_NORMAL
;
; Copy Files
;
[DriverDemo.DriverFiles]
DriverDemo.sys
;;
;; String Section
;;
[Strings]
Jason = "Jason"
DriverDemoServiceDesc = "DriverDemo.Inf"
DriverDemoServiceName = "DriverDemo"
DriverDemoRegistry = "system\currentcontrolset\services\DriverDemo" - 由于在inf文件中创建了DriverDemo名字的服务,故用管理员权限打开cmd,开启服务
安装失败,开始windbg双机调试
3. 双机调试
在搭建好双机调试环境之后,开始对DriverDemo.sys进行调试,但由于自己对于驱动调试不熟悉,只能做到双机调试虚拟机里面的用户态程序。google后,捣鼓了一段时间,作品提交时间截止,就暂且搁置了,后面要做其他实验,就把虚拟机给还原了,暂时不碰驱动调试。