0%

腾讯游戏安全竞赛2020PC方向初赛

0x00 背景

2018年因为找工作的原因,和同学一起参加过游戏安全竞赛,比赛比较有趣,就一直想再参加一次。2019年为什么不参加?当时已经准备读研了,感觉没有参加的必要,所以今年想着再参加一次。

赛制:分为初赛和决赛

方向:PC、Android、ML、NLP

PC赛题下载

0x01 PC赛题

PC初赛赛题包含两个题,ring0和ring3,分别分析内核态和用户态的程序。ring3题是一道签到题,ring0题需要双机调试(时间不够,没做出来,太菜了)

  1. ring3 扫雷exe程序和一段内存dump
  2. ring0 一款有问题的驱动程序

0x02 ring3

1. 题目要求

1
2
3
winmine.exe是一个扫雷游戏程序,winmine.dmp是该程序的一份进程dump, 在这份dump中,winmine.exe的内存映像有指令被篡改,篡改实现了外挂功能。
1, 请找出dump中,winmine.exe的内存映像中2处被篡改实现外挂功能的指令(被篡改指令的偏移、篡改前后的指令分别是什么),并分析这些指令篡改所实现的外挂功能是什么。(4分)
2, 请提供文档,详细描述解题过程,如涉及编写程序,必须提供源代码。(1分)

2. 初步分析

  • 通过OD打开winmine.exe,定位代码块,冲上往下看到的第一条指令开始地址为0100140C

    pic
  • 然后用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插件比较两块代码的区别,找到代码段四处不同处

    pic
  • 经过分析,第一处不同是因为我之前设置了断点,所以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

    pic

外挂功能:可以让扫雷的计时器停止,永远为1s,此处inc指令代表+1,判断调用了系统dll的时钟函数,用来记录时间,当用nop代替后,时间记录生效。

pic

3.2 第二处不同点:

01003591处6A 00变为EB 1D,汇编指令push 0变为jmp short winmine.010035B0,变化前如下图

pic

变化后,如下图

pic

外挂功能:正常的扫雷,当我们点击到地雷时,本局游戏会结束,然而此处代码通过一个jmp指令,没有调用结束模块,让我们能够继续进行本局游戏,示例图如下

pic

自此,签到题结束

0x03 ring0

1. 题目要求

1
2
3
DriverDemo.sys是一个驱动程序,它内置了一些限制。
1, 不能篡改该文件,尝试使驱动成功加载。(3分)
2, 该驱动程序成功加载后,突破它的限制,但不允许patch文件或内存,使它成功打印出(用dbgview可接受)调试信息"hello world!".(2分)

2. 初步分析

  • 设置Windows 10虚拟机高级启动选项,禁用驱动程序强制签名
  • 最开始没用管理员权限打开,viewdbg不能捕获内核,google后新建注册项,在下图所示路径新建DWORD=0xf,后来突然想起没给viewdbg管理员权限,给了之后可以捕获内核(可能是管理员权限或者是注册表原因)

    pic
  • 编写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,开启服务

    pic

    安装失败,开始windbg双机调试

3. 双机调试

在搭建好双机调试环境之后,开始对DriverDemo.sys进行调试,但由于自己对于驱动调试不熟悉,只能做到双机调试虚拟机里面的用户态程序。google后,捣鼓了一段时间,作品提交时间截止,就暂且搁置了,后面要做其他实验,就把虚拟机给还原了,暂时不碰驱动调试。