WOW64是Microsoft为了向后兼容,而在64位Windows系统上推出的一套32位系统的模拟器,它使得32位程序在64位系统上运行成为可能。
自WOW64推出以来,对其安全性的研究就一直在持续,并先后发掘出了多项利用技术,其中比较有代表性的有“天堂之门”和wow64log.dll劫持。
“天堂之门”(Heaven’s Gate)是最著名的WOW64利用技术。早在2006年,该项技术就已经出现在乌克兰的一家黑客技术交流网站VxHeaven(Vx意为Virus eXechange)上(注:因该网站已于2012年被乌克兰警方查封,未见到原始素材)。正如其名字所言,“天堂之门”的利用点发生在32位模式与64位模式的交界—调用门(Gate)处。时至今日,“天堂之门”仍被当作规避安全防护的一种有效技术,为许多黑客组织所利用,并不时出现在安全研究人员的视野中。
Wow64log.dll劫持是近几年研究发掘的另一项WOW64利用技术。它是通过编写和劫持wow64log.dll,实现对WOW64进程的注入。
2.1 保护模式下的操作系统
在划分特权级的情况下,用户程序只能经由操作系统的接口部分(ntdll.dll),以syscall或int 2e的方式通过门(调用门或中断门),才能实现对内核态代码的调用,这样就实现了对操作系统内核的保护。
比如,一个64位系统上的64位进程,其转入内核态的代码如下:
但是,由于32位代码和64位代码间的差异,对于32位程序以及相应的32位Ntdll.dll来说,它不能以syscall或int 2e的方式直接调用64位内核态代码。为了32位程序在64位内核下也能正常运行,就出现了WOW64子系统。
2.2 WOW64
WOW64子系统,官方的叫法是WOW64模拟器。微软官网[3]对其描述为:“WOW64模拟器运行于用户模式,它提供了32位版本Ntdll.dll与处理器内核之间的一个接口,并对内核调用进行拦截。”
WOW64支持X64和ARM64两种架构,主要包括以下模块:
-
Wow64.dll提供核心模拟架构以及Ntoskrnl.exe入口函数的thunk -
Wow64win.dll提供win32k.sys入口函数的thunk -
(仅X64)Wow64cpu.dll为X86程序在X64上运行提供支持 -
(仅Itanium)IA32Exec.bin包含X86软件模拟器 -
(仅Itanium)Wowia32x.dll提供IA32Exec.bin与WOW64间的接口 -
(仅ARM64)xtajit.dll包含X86软件模拟器 -
(仅ARM64)Wowarmw.dll为ARM32程序在ARM64上运行提供支持
64位Windows系统增添了WOW64后,就变成了如下架构:
从这个图可以看出:32位进程要转入64位内核态,首先要由WOW64子系统将32位Ntdll.dll的API调用转换为64位Ntdll.dll的API调用,再由64位Ntdll.dll的API调用,以syscall或int 2e的方式转入内核态。
关于WOW64的实现细节,微软的描述简短且隐晦:
-
“启动时,Wow64.dll载入X86版的Ntdll.dll并运行其初始化代码,初始化代码将载入所有必需的32位dll” -
“执行系统调用的32位代码不是使用X86的系统服务调用序列,而是被改造为使用一种特定的调用序列。该调用序列将被WOW64拦截,并由WOW64CPU转换为64位调用“ -
“thunk从32位栈中提取参数,将参数扩展位64位, 然后执行64位系统调用“
3.1 “天堂之门”
“天堂之门”围绕的主要问题是:32位代码调用系统服务时的特定调用序列到底是什么,转入64位系统是如何达成的。
这个在火文和其它文章中都有较详细的介绍,简单来说(以NtResumeThread为例)就是:
-
(特定调用序列)NtResumeThread调用Wow64SystemService
-
(至64位模式的转换函数Thunk)Wow64SystemService调用Wow64Transition
-
(从32位模式转移至64位模式)Wow64Transition指向wow64cpu!KiFastSystemCall,后者通过远跳转(far jmp)实现X86到X64的转移
从这里可以看出:实现X86到X64转换的关键就是远跳转,即形如jmp cs:eip的跳转。其中,CS为段选择子:
-
当cs=0x33时,对应64位模式 -
当cs=0x23时,对应32位模式
“天堂之门”就是利用far jmp,或者等价的Call、retf,不通过32位ntdll.dll,直接实现对64位系统服务的调用。因为实现技术上的原因,许多防护软件都是通过注入32位ntdll.dll来对程序的运行行为进行监控,由于“天堂之门”不调用322位ntdll.dll中的API函数,这样就达到了躲避监控的目的。
以下是(ReWolf) [4]A PoC heaven’s gate implementation中的一个POC:
#define EM(a) __asm __emit (a)
#define X64_Start_with_CS(_cs)
{
EM(0x6A) EM(_cs) /* push _cs */
EM(0xE8) EM(0) EM(0) EM(0) EM(0) /* call $+5 */
EM(0x83) EM(4) EM(0x24) EM(5) /* add dword [esp], 5 */
EM(0xCB) /* retf */
}
#define X64_End_with_CS(_cs)
{
EM(0xE8) EM(0) EM(0) EM(0) EM(0) /* call $+5 */
EM(0xC7) EM(0x44) EM(0x24) EM(4) /* */
EM(_cs) EM(0) EM(0) EM(0) /* mov dword [rsp + 4], _cs */
EM(0x83) EM(4) EM(0x24) EM(0xD) /* add dword [rsp], 0xD */
EM(0xCB) /* retf */
}
#define X64_Start() X64_Start_with_CS(0x33)
#define X64_End() X64_End_with_CS(0x23)
Wow64log.dll围绕的是另一个问题:WOW64的初始化过程执行了哪些操作,期间有没有可以利用的地方。
对于该问题最详细的解答,可以参考火文提供的另一链接(wbenny)[5]:An extremely detailed view of WOW64 internals on ARM。
透过Wbenny的这篇文章,可以知道:在WOW64初始化过程中,会载入wow64log.dll,而且该dll会被每个WOW64进程装载。但在发布的Windows系统中,该dll并不存在(疑为开发过程中使用)。
这样,通过编写该dll并放入适当位置,就可以实现对所有WOW64进程的注入。
[1]https://www.fireeye.com/blog/threat-research/2020/11/wow64-subsystem-internals-and-hooking-techniques.html
原文始发于微信公众号(国家网络威胁情报共享开放平台):WOW64利用技术原理分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论