0x01 ring3 程序分析

题目描述

winmine.exe是一个扫雷游戏程序,winmine.dmp是该程序的一份进程dump, 在这份dump中,winmine.exe的内存映像有指令被篡改,篡改实现了外挂功能。

1, 请找出dump中,winmine.exe的内存映像中2处被篡改实现外挂功能的指令(被篡改指令的偏移、篡改前后的指令分别是什么),并分析这些指令篡改所实现的外挂功能是什么。(4分)

2, 请提供文档,详细描述解题过程,如涉及编写程序,必须提供源代码。(1分)

题目分析

定位dump中的内存映像

使用工具:WinDbg Preview 1.0.2001.02001

  1. 首先使用WinDbg Preview加载程序,观察函数调用栈,可以快速定位到winmine.exe的加载位置。

    image-20200403134948899

  2. 然后启用Disassembly窗口,可以发现属于winmine.exe的汇编码,至此,我们能够定位到winmine.exe的内存映像位置。

  3. 另外,我们还在此映像中发现了CE(CheatTools)的运行痕迹,说明攻击者使用此工具进行了软件的破解。

定位被Patch的代码点

使用工具:010 Editor For Mac v9.0.1IDA Pro For Mac v7.0

  1. 首先检索我们获取的汇编码C7 05 5C 51 00 01 01 00 00 00

    image-20200403135718751

  2. 然后在其上发现了text节区的字符串。

    image-20200403135829892

  3. 可以用相同的方法定位文件末尾的代码点。

    image-20200403135901978

  4. 然后使用010 Editor的文件比较功能,可以快速定位被Patch的代码点。

    image-20200403140009876

    image-20200403140033727

  5. 然后使用IDA来分析,加载winmine.exe,并寻找第一处相异点。

    image-20200403140739178

    image-20200403140819300

  6. 查看其对应的汇编码。

    image-20200403140936372

    可以看到,攻击者将.text:01002FF5 inc dword_100579C进行了NOP

    image-20200403141331443

    原逻辑是,若0x100579c处的值小于999,则递增。

    那么我们其实是可以猜测此处是一个计时器的,那么我们来做一个简单的验证,我们做一下和攻击者相同的操作。

    image-20200403141719619

  7. 可以看到,计时器不再走动。

    image-20200403141839346

  8. 当然我们也可以在此处使用Ollydbg下断点,观察触发断点的时机,此处不再说明。

  9. 接下来我们定位另一个攻击点。

    image-20200403142224950

    image-20200403142339778

  10. 查看其对应的汇编码。

    image-20200403142428619

    image-20200403142958920

  11. 可以看到,攻击者将push 0这个压参操作转换为了jmp short loc_10035B0

  12. 那么首先进行最简单的功能猜测,我们做一遍和攻击者相同的操作。

    image-20200403143747453

  13. 尝试运行,可以发现当我们踩中雷时,程序也没有终止程序,因此我们可以认为我们刚刚把踩中雷的处理流程篡改为了无雷的处理流程。

    image-20200403143900210

  14. 这里我们已知,扫雷游戏中,我们的第一次点击永远不会是雷,若第一次就点中雷,程序会做一次雷和普通格子的替换后忽视我们的踩雷。这个逻辑在这里实现:

    image-20200403144515069

    而我们patch后,恰好把触雷逻辑patch成了忽视触雷逻辑。

    image-20200403144634493

题目总结

  1. 攻击者将0x01002FF5处的定时器递增逻辑NOP掉了。

    原指令:inc dword_100579C

    新指令:nop

  2. 攻击者将0x01003591处的触雷逻辑替换为了忽视触雷逻辑。

    原指令:push 0

    新指令:jmp 0x10035B0

0x02 ring0 程序分析

题目描述

DriverDemo.sys是一个驱动程序,它内置了一些限制。

1, 不能篡改该文件,尝试使驱动成功加载。(3分)

2, 该驱动程序成功加载后,突破它的限制,但不允许patch文件或内存,使它成功打印出(用dbgview可接受)调试信息”hello world!”.(2分)

请以文档方式,详细描述解题过程,如涉及编写程序,必须提供源代码。

驱动未签名,需要设置Windows 10高级启动选项,禁用驱动程序强制签名后方可答题,支持使用虚拟机。

题目分析

加载驱动

  1. 首先以高级启动方式重启电脑(全部设置->更新与安全->恢复)。

    image-20200403151212322

    image-20200403151255067

  2. 在”疑难解答->高级选项->启动设置”中,选择重启。

    image-20200403150933557

    image-20200403150950312

    image-20200403151022777

  3. 然后输入7以禁用驱动程序强制签名。

  4. 之后我们为了加载该驱动程序,需要手动编写一个INF文件。

    [Version]
    Signature   = "$CHICAGO$" 
    Provider    = ERROR404
    DriverVer   = 8/21/2002,3.0.0.3               
    Class       = DisplayCodec
    ClassGUID   = {E6ABB47D-8339-4c60-BE92-E9045FF5A33D}                                   
    
    [DestinationDirs]
    DefaultDestDir               = 12
    DriverDemo.DriverFiles      = 12
    
    [SourceDisksNames] 
    1 = "DriverDemo",Disk1,,
    
    [SourceDisksFiles]
    DriverDemo.sys = 1,objfre\i386,
    
    [DefaultInstall]
    OptionDesc  = %DriverDemoServiceDesc%
    CopyFiles   = DriverDemo.DriverFiles
    AddReg      = DriverDemo.AddRegistry
    
    [DefaultInstall.Services]
    AddService          = %DriverDemoServiceName%,,DriverDemo.Service
    
    [DefaultUninstall]
    DelFiles   = DriverDemo.DriverFiles
    DelReg     = DriverDemo.DelRegistry
    
    [DefaultUninstall.Services]
    DelService = DriverDemo,0x200    
    
    [DriverDemo.Service]
    DisplayName      = %DriverDemoServiceName%      
    Description      = %DriverDemoServiceDesc%      
    ServiceBinary    = %12%\DriverDemo.sys
    ServiceType      = 1      
    StartType        = 3      
    ErrorControl     = 1   
    LoadOrderGroup   = "DriverDemo"
    
    
    [DriverDemo.DriverFiles]
    DriverDemo.sys
    
    [DriverDemo.AddRegistry]
    HKLM,%DriverDemoRegistry%,%DriverDemoKey%,0x00010001,1
    
    [DriverDemo.DelRegistry]
    HKLM,%DriverDemoRegistry%,%DriverDemoKey%
    
    ;;
    ;; String Section
    ;;
    
    [Strings]
    DriverDemoServiceDesc = "DriverDemo.Inf"
    DriverDemoServiceName = "DriverDemo"
    DriverDemoRegistry    = "SOFTWARE\AppDataLow\Tencent\{61B942F7-A946-4585-B624-B2C0228FFEBC}"
    DriverDemoKey         = "key"
    Disk1                 = "DriverDemo Source Media"
    
  5. 然后在Windows中右击安装此inf文件即可,通过查阅系统日志,发现此驱动程序已被成功加载。

    image-20200403155833521

    image-20200403155852907

  6. 接下来通过sc start DriverDemo启动

    image-20200403193002114

    image-20200403191236783

  7. 这里有一个点是注册表,不添加注册表的值也是可以将驱动挂载到系统的,但是驱动会随即退出,提示:

    image-20200403191430475

  8. 这里可以在驱动运行到OEP时提取文件来过掉部分VMP保护,进而可以分析出核心的检查代码:

    image-20200403191610776

让驱动打印Hello World

此部分请直接参阅大佬的博客

分类: CTF

0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注