背 景
近日发现了一款特别的恶意软件加载器,该加载器使用了叫做天堂之门(Heaven’s Gate)的技术,可以通过注入内存来释放恶意软件,并且能够规避杀毒软件的检测。
天堂之门并不是一项全新的技术,但是仍然被病毒制造者广泛的使用。该技术基于32位应用程序的基础上,向64位进程注入恶意代码,从而隐藏API调用,使其更加难以被检测到。
具体的行为流程如下:
注:PEB是Process Environment Block的缩写,其中存储了进程用户态重要的数据结构。
详细分析
在64位系统中,32位的应用程序运行在一个WoW64的子系统中,这个子系统为32位程序提供了一个类似沙箱的运行环境。事实上这个32位程序运行的环境也是一个64位的运行环境,系统在创建32位进程时,首先创建一个64位的进程,然后再在其中创建一个32位的子环境。32位程序所调用的系统函数,最终都要通过64位的动态链接库而实现。
通过下图我们可以看一下,一个32位的进程不仅加载了C:\Windows\SysWow64下的动态链接库,也加载了C:\Windows\system32下的动态链接库。C:\Windows\SysWow64是提供给32位程序使用动态链接库;C:\Windows\system32是64位系统的动态链接库。
在这个基础上,代码如何从32位转向64位是一个关键问题。Winodws系统中,CS段寄存器用来标识目前所运行的代码是32位的,还是64位的。
下图是32位进程中寄存器的状况,可以看到CS是0X23。
而下图是64位进程中寄存器的状况,可以看到CS是0X33。
在Windows中,通过改变段寄存器CS的值就可以实现32位代码和64位代码之间的转换。
下面我们来看一下两种模式之间转换的代码:
在上面的代码中,我们重点要理解的是retf这个指令,retf指令和ret指令是不同的。
ret指令是常用的函数返回指令,ret仅仅弹出栈顶到IP寄存器(指令寄存器)中。
ret指令返回前 | ret指令返回后 |
---|---|
IP(栈顶) | |
ARG1 | ARG1(栈顶) |
ARG2 | ARG2 |
retf是不一样的,retf又叫做far ret,是带有段寄存器的返回。retf同时弹出两个值,一个弹出到CS(段寄存器),一个弹出到IP(指令寄存器)。
retf指令返回前 | retf指令返回后 |
---|---|
IP(栈顶) | |
CS | |
ARG1 | ARG1(栈顶) |
ARG2 | ARG2 |
现在我们再看上面的模式转换代码就容易理解了:
push _cs | 把0X23或0X33压栈 |
---|---|
call $+5add dword [esp], 5 | 把一个代码地址入栈 |
retf | 模式转换 |
让我们从调试器中查看一下运行状况:
从上面的图中可以看到,retf指令的地址是0X706F124C。而此时栈顶的两个值是IP()X706F124D)和CS(0X33)。IP指向的是retf之后的指令。代码将从retf之后按照64位模式继续执行。
上面的运行示例是从32位转向64模式的情况,要想反过来转换,只要把CS的0X33换成0X23就可以了。
在完成了模式的转换之后,后面的一切就会变得简单起来。从PEB中获取进程所加载的动态链接库是shellcode中一个常用的技巧。本篇文章只简单的说明一下,不对这个技巧做过多的描述了。
要获取进程PEB结构,首先要获得当前线程的TEB结构。可以通过R12寄存器或者FS寄存器获取TEB结构,TEB偏移0X30处就是指向PEB的指针。PEB->Ldr->InMemoryOrderModuleList保存了进程加载的模块列表。整个过程的重要部分大致如此。
下面是一个运用了此技术的32位的恶意软件NGay,但是它创建了64位进程,并完成了向64位进程的注入。
防护措施
1、不要轻易打开可疑文件,如电子邮件、可疑链接、可疑文档等等;
2、及时安装系统补丁,使用最新版本的软件;
3、安装杀毒软件,及时更新病毒库;
4、使用“铁穹高级持续性威胁预警系统”(简称“铁穹”)发现潜在的攻击行为,及时响应和阻断,避免造成业务中断或经济损失。