WOW64利用技术原理分析

admin 2022年6月8日06:46:00安全文章评论10 views3726字阅读12分25秒阅读模式
近来,黑客利用10多年前的“老”技术—“天堂之门”躲避监测的情况引起了众多安全研究人员的关注。为此,火眼公司专门发表了“WoW64 subsystem internals and hooking techniques”[1]一文(以下简称为“火文”),对“天堂这门”以及其它WOW64利用技术进行了详细介绍,国内相关公众号也对该文进行了翻译和转载[2]。因为WOW64是系统级的模拟器,理解和掌握WOW64利用技术需要许多系统底层的知识。这里,我们对“天堂之门”以及另一项WOW64利用技术—wow64log.dll劫持技术的原理作一点粗浅的分析,以方便大家了解相关技术。



 1
背景



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 
WoW64子系统




2.1 保护模式下的操作系统


我们知道,CPU在发展到80386以后,引入了保护模式的概念。在保护模式下,程序代码的运行状态可以有ring0~ring3四个特权级。相应地,Windows系统也将程序代码的运行状态分成了2个特权等级:ring0和ring3。操作系统内核工作在ring0(内核态)下;用户程序,以及操作系统的其它部分,则工作在ring3(用户态)下。一个典型的Windows系统,其结构如以下:

WOW64利用技术原理分析

在划分特权级的情况下,用户程序只能经由操作系统的接口部分(ntdll.dll),以syscall或int 2e的方式通过门(调用门或中断门),才能实现对内核态代码的调用,这样就实现了对操作系统内核的保护。

比如,一个64位系统上的64位进程,其转入内核态的代码如下:

WOW64利用技术原理分析

但是,由于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后,就变成了如下架构:

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 
WOW64利用技术



现有的WOW64利用技术,主要就是围绕微软的以上描述展开。


3.1 “天堂之门”

“天堂之门”围绕的主要问题是:32位代码调用系统服务时的特定调用序列到底是什么,转入64位系统是如何达成的。

这个在火文和其它文章中都有较详细的介绍,简单来说(以NtResumeThread为例)就是:

  • (特定调用序列)NtResumeThread调用Wow64SystemService


WOW64利用技术原理分析

  • (至64位模式的转换函数Thunk)Wow64SystemService调用Wow64Transition

WOW64利用技术原理分析

  • (从32位模式转移至64位模式)Wow64Transition指向wow64cpu!KiFastSystemCall,后者通过远跳转(far jmp)实现X86到X64的转移

WOW64利用技术原理分析

从这里可以看出:实现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)

3.2 WOW64log.dll劫持

Wow64log.dll围绕的是另一个问题:WOW64的初始化过程执行了哪些操作,期间有没有可以利用的地方。

对于该问题最详细的解答,可以参考火文提供的另一链接(wbenny)[5]:An extremely detailed view of WOW64 internals on ARM。

透过Wbenny的这篇文章,可以知道:在WOW64初始化过程中,会载入wow64log.dll,而且该dll会被每个WOW64进程装载。但在发布的Windows系统中,该dll并不存在(疑为开发过程中使用)。

这样,通过编写该dll并放入适当位置,就可以实现对所有WOW64进程的注入。




 4 
参考链接



[1]https://www.fireeye.com/blog/threat-research/2020/11/wow64-subsystem-internals-and-hooking-techniques.html

[2]https://www.anquanke.com/post/id/222243
[3]https://docs.microsoft.com/en-us/windows/win32/winprog64/wow64-implementation-details
[4]http://blog.rewolf.pl/blog/?p=102
[5]https://wbenny.github.io/2018/11/04/wow64-internals.html


WOW64利用技术原理分析
WOW64利用技术原理分析



WOW64利用技术原理分析

原文始发于微信公众号(国家网络威胁情报共享开放平台):WOW64利用技术原理分析

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月8日06:46:00
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  WOW64利用技术原理分析 http://cn-sec.com/archives/896348.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: