4.3
使用Shim进行内存修补
在内联挂接中,我们看到了函数中的一系列字节是如何被修补以将控制权重定向到恶意代码的。使用应用程序兼容性垫片可以进行内存内修补(具体细节已在之前的推文中介绍过)。
微软使用内存打补丁的功能以应用补丁来修复其产品中的漏洞。内存打补丁是一个没有记录的功能,在兼容性管理员工具中也没有,但是安全研究人员通过逆向工程已经弄清楚了内存打补丁的功能,并且开发了分析它们的工具。
*Jon Erickson的sdb-explorer和William Ballenthin的python-sdb允许你通过分析shim数据库(.sdb)文件。
项目网址:
sdb-explorer:
https://github.com/evil-e/sdb-explorer
python-sdb:
https://github.com/williballenthin/python-sdb
*左右滑动查看更多
以下几位研究人员的演讲中包含了关于内存补丁的详细信息,以及分析这些补丁的工具。
持续使用和滥用微软的补丁:
https://www.blackhat.com/docs/asia-14/materials/Erickson/WP-Asia-14-Erickson-Persist-It-Using-And-Abusing-Microsofts-Fix-It-Patches.pdf
真正的垫片黑幕:
http://files.brucon.org/2015/Tomczak_and_Ballenthin_Shims_for_the_Win.pdf
*左右滑动查看更多
恶意软件作者使用内存补丁来注入代码和钩住API功能。使用内存打补丁的恶意软件样本之一是GootKit;这个恶意软件使用sdbinst工具安装各种垫片数据库(文件)。下面的截图显示了为多个应用程序安装的垫片,该截图显示了与explorer.exe相关的.sdb文件。
安装的.sdb文件包含将被直接修补到目标进程内存中的shellcode。我们可以使用sdb_dump_database.py脚本(python-sdb工具的一部分)来检查.sdb文件,命令如下。
python sdb_dump_database.py {4c895e03-f7a5-4780-b65b-549b3fef0540}.sdb
*左右滑动查看更多
前面命令的输出显示恶意软件以explorer.exe为目标,并应用名为patchdata0的垫片。垫片名称下面的PATCH_BITS是一个原始的二进制数据,包含将被打入explorer.exe内存的shellcode。
为了知道shellcode在做什么,我们需要能够解析PATCH_BITS,它是一个无文档的结构。为了解析这个结构,我们可以使用sdb_dump_patch.py脚本(python-sdb的一部分),给出补丁名称,patchdata0,如上图所示。
python sdb_dump_patch.py {4c895e03-f7a5-4780-b65b-549b3fef0540}.sdb patchdata0
*左右滑动查看更多
运行前面的命令显示在explorer.exe内的kernel32.dll中应用的各种补丁。下面的截图显示了第一个补丁,它在相对虚拟地址(RVA)0x0004f0f2处匹配了两个字节,8B FF(mov edi,edi),并用EB F9(jmp 0x0004f0ed)替换它们。换句话说,它将控制权重定向到RVA 0x0004f0ed。
下面的输出显示了在kernel32.dll的RVA 0x0004f0ed处应用的另一个补丁,恶意软件用调用0x000c61a4替换了一系列NOP指令,从而将程序控制重定向到RVA 0x000c61a4处的功能。这样,恶意软件修补了kernel32.dll中的多个位置,并进行了各种重定向,最终将其引向实际的shellcode。
为了了解恶意软件在kernel32.dll中打了什么补丁,我们可以将调试器连接到打了补丁的explorer.exe进程,并在kernel32.dll中找到这些补丁。例如为了检查RVA 0x0004f0f2的第一个补丁,我们需要确定kernel32.dll被加载的基址。
在文中这个例子中,它被加载在0x76730000,然后加上RVA 0x0004f0f2(换句话说,0x76730000 + 0x0004f0f2 = 0x7677f0f2)。下面的截图显示,这个地址0x7677f0f2与API函数LoadLibraryW()相关。
检查LoadLibraryW()函数可以看到该函数开始时的跳转指令,该指令最终将把程序控制权转给shellcode。
这种技术很有趣,因为在这种情况下,恶意软件没有直接分配内存或注入代码,而是依靠微软的shim功能来注入shellcode和钩住LoadLibraryW()API。它还通过跳转到kernel32.dll中的不同位置来使检测变得困难。
五
其他资源
除了本章介绍的代码注入技术外,安全研究人员还发现了其他各种注入代码的手段。以下是一些新的代码注入技术,以及拓展阅读的资源途径。
• ATOMBOMBING: BRAND NEW CODE INJECTION FOR WINDOWS:
https:// blog.ensilo.com/atombombing-brand-new-code-injection-for-windows
*左右滑动查看更多
•PROPagate:
http://www.hexacorn.com/blog/2017/10/26/propagate-a-new- code-injection-trick/
*左右滑动查看更多
•Process Doppelgänging, by Tal Liberman and Eugene Kogan:
https://www.blackhat.com/docs/eu-17/materials/eu-17-Liberman-Lost-In-Transaction-Process- Doppelganging.pdf
*左右滑动查看更多
•Gargoyle:
https://jlospinoso.github.io/security/assembly/c/cpp/ developing/software/2017/03/04/gargoyle-memory-analysis-evasion.html
*左右滑动查看更多
•GHOSTHOOK:
https://www.cyberark.com/threat-research-blog/ghosthook- bypassing-patchguard-processor-trace-based-hooking/
*左右滑动查看更多
在本章中,我们主要关注的是用户空间的代码注入技术;在内核空间也可以实现类似的功能(我们将在后续的文章中向大家介绍内核空间的钩子技术)。以下书籍应该能帮助各位更深入地了解rootkit技术和Windows内部概念。
•The Rootkit Arsenal: Escape and Evasion in the Dark Corners of the System (2nd Edition), by Bill Blunden
•Practical Reverse Engineering: x86, x64, ARM, Windows Kernel, Reversing Tools, and Obfuscation, by Bruce Dang, Alexandre Gazet, and Elias Bachaalany
•Windows Internals (7th Edition), by Pavel Yosifovich, Alex Ionescu, Mark E. Russinovich, and David A. Solomon
六
总结
在本系列的文章中,我们研究了恶意程序用来在合法进程的上下文中注入和执行恶意代码的不同代码注入技术。这些技术允许攻击者执行恶意行为并绕过各种安全产品。除了执行恶意代码,攻击者还可以劫持合法进程调用的API函数(使用钩子),并将控制权重定向到恶意代码,以监视、阻止甚至过滤API的输出,从而改变程序的行为。
在后续的文章中,我们还将会更新更多内容中,例如将学习到攻击者为不被安全监控解决方案发现而使用的各种混淆技术,敬请期待。
(完)
— 往期回顾 —
原文始发于微信公众号(安恒信息安全服务):九维团队-青队(处置)| 代码注入和钩子(八)