4

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

 1 year ago
source link: https://jason1314zhang.github.io/blog/%E8%85%BE%E8%AE%AF%E6%B8%B8%E6%88%8F%E5%AE%89%E5%85%A8%E7%AB%9E%E8%B5%9B2020PC%E6%96%B9%E5%90%91%E5%88%9D%E8%B5%9B/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

0x00 背景

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

赛制:分为初赛和决赛

方向:PC、Android、ML、NLP

PC赛题下载

0x01 PC赛题

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

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

0x02 ring3

1. 题目要求

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. 题目要求

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

2. 初步分析

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

    pic
  • 编写DriverDemo.inf文件,在win10虚拟机下安装DriverDemo.sys
    [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后,捣鼓了一段时间,作品提交时间截止,就暂且搁置了,后面要做其他实验,就把虚拟机给还原了,暂时不碰驱动调试。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK