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
- 首先使用
WinDbg Preview
加载程序,观察函数调用栈,可以快速定位到winmine.exe
的加载位置。 -
然后启用
Disassembly
窗口,可以发现属于winmine.exe
的汇编码,至此,我们能够定位到winmine.exe
的内存映像位置。 -
另外,我们还在此映像中发现了CE(CheatTools)的运行痕迹,说明攻击者使用此工具进行了软件的破解。
定位被Patch的代码点
使用工具:010 Editor For Mac v9.0.1
、IDA Pro For Mac v7.0
- 首先检索我们获取的汇编码
C7 05 5C 51 00 01 01 00 00 00
。 -
然后在其上发现了
text
节区的字符串。 -
可以用相同的方法定位文件末尾的代码点。
-
然后使用
010 Editor
的文件比较功能,可以快速定位被Patch
的代码点。 -
然后使用
IDA
来分析,加载winmine.exe
,并寻找第一处相异点。 -
查看其对应的汇编码。
可以看到,攻击者将
.text:01002FF5 inc dword_100579C
进行了NOP
。原逻辑是,若0x100579c处的值小于999,则递增。
那么我们其实是可以猜测此处是一个计时器的,那么我们来做一个简单的验证,我们做一下和攻击者相同的操作。
-
可以看到,计时器不再走动。
-
当然我们也可以在此处使用
Ollydbg
下断点,观察触发断点的时机,此处不再说明。 -
接下来我们定位另一个攻击点。
-
查看其对应的汇编码。
-
可以看到,攻击者将
push 0
这个压参操作转换为了jmp short loc_10035B0
。 -
那么首先进行最简单的功能猜测,我们做一遍和攻击者相同的操作。
-
尝试运行,可以发现当我们踩中雷时,程序也没有终止程序,因此我们可以认为我们刚刚把踩中雷的处理流程篡改为了无雷的处理流程。
-
这里我们已知,扫雷游戏中,我们的第一次点击永远不会是雷,若第一次就点中雷,程序会做一次雷和普通格子的替换后忽视我们的踩雷。这个逻辑在这里实现:
而我们
patch
后,恰好把触雷逻辑patch
成了忽视触雷逻辑。
题目总结
-
攻击者将
0x01002FF5
处的定时器递增逻辑NOP掉了。原指令:
inc dword_100579C
新指令:
nop
-
攻击者将
0x01003591
处的触雷逻辑替换为了忽视触雷逻辑。原指令:
push 0
新指令:
jmp 0x10035B0
0x02 ring0 程序分析
题目描述
DriverDemo.sys是一个驱动程序,它内置了一些限制。
1, 不能篡改该文件,尝试使驱动成功加载。(3分)
2, 该驱动程序成功加载后,突破它的限制,但不允许patch文件或内存,使它成功打印出(用dbgview可接受)调试信息”hello world!”.(2分)
请以文档方式,详细描述解题过程,如涉及编写程序,必须提供源代码。
驱动未签名,需要设置Windows 10高级启动选项,禁用驱动程序强制签名后方可答题,支持使用虚拟机。
题目分析
加载驱动
- 首先以高级启动方式重启电脑(全部设置->更新与安全->恢复)。
-
在”疑难解答->高级选项->启动设置”中,选择重启。
-
然后输入7以禁用驱动程序强制签名。
-
之后我们为了加载该驱动程序,需要手动编写一个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"
- 然后在Windows中右击安装此inf文件即可,通过查阅系统日志,发现此驱动程序已被成功加载。
-
接下来通过
sc start DriverDemo
启动 -
这里有一个点是注册表,不添加注册表的值也是可以将驱动挂载到系统的,但是驱动会随即退出,提示:
-
这里可以在驱动运行到OEP时提取文件来过掉部分VMP保护,进而可以分析出核心的检查代码:
让驱动打印Hello World
此部分请直接参阅大佬的博客
0 条评论