一种新型shellcode仿真框架分析

  • A+

译文声明
本文是翻译文章,文章原作者DarunGrim,文章来源:https://darungrim.com
原文地址:https://darungrim.com/research/2020-06-04-UsingMemoryArtifactsAsShellcodeEmulationEnvironment.html

前言

Shellcode是现代恶意软件的重要组成部分。它通过利用漏洞把shellcode注入到缓冲区,欺骗目标进程执行。最近,我们发现shellcode更多用来对抗检测和分析。在APT攻击或commodity攻击中,高度混淆的shellcode非常常见。

尽管有很多现成的静态或动态分析工具和服务来帮助我们观察恶意软件行为,但是shellcode会通过各种方式来隐藏自己行为。而且在分析恶意代码时,经常遇见反虚拟机技术。恶意程序中加入检测虚拟机及沙箱的代码,以判断程序所处的运行环境。当发现程序处于虚拟机沙箱中时,它就会改变操作行为隐蔽恶意动作,逃避检测。

在本文中,我们将讨论使用仿真框架分析shellcode的方法。

实现方法

我们提出一种利用内存工件来进行shellcode仿真。Shellcode通常是以位置无关方式进行访问的,并且可以在任何进程中运行。许多shellcode模拟器都依赖于内置的内存结构。我们的思路是既然所有所必须的内存组件都可以从进程映像转储中获得。如TEB/PEB,已加载的模块映像列表甚至DLL代码等相关的内存结构都可以在映像中获取,那么可以将Windows进程映像作为仿真环境。
::: hljs-center

1.png

:::

ShellCodeEmulator是一个使用Unicorn框架进行仿真并使用Windows进程映像作为内存工件源的框架。

目标Shellcode

本演示案例中,使用一个Windows x64下 shellcode,其SHA1哈希为33312f916c5904670f6c3b624b43516e87ebb9e3。

PEB访问

Shellcode中最重要的部分是访问PEB结构。PEB结构将告诉我们关于进程自身的信息,其中包括我们所需要的信息是基本DLL的位置。您可以通过“gs:[rdx]”内存位置访问PEB,其中‘rdx’设置为0x60,GS:60表示PEB指针所在的位置。
::: hljs-center

2.png

:::

在x64平台下的PEB块结构如下所示。偏移量为0x19处的指令“mov rsi,[rsi+18h]”表示从“+0x018 Ldr”处检索指针。
::: hljs-center

3.png

:::

下图为“ Ldr”指针的数据结构,结构体中“InLoadOrderModuleList”成员是已加载模块的链接列表。我们可以根据此结构,访问dll基址。

::: hljs-center

4.png

:::

通常,shellcode通过遍历PEB.ldr结构来查找所需API。它将检索第一个模块的基地址(通常是kernel32),通过对比API哈希值找到WinExec API的位置。最终,shellcode通过调用检索到的API指针调用外部进程(calc.exe)。

GDT(全局描述符表)和Unicorn框架

为了模拟一个shellcode执行环境,我们面临的第一个挑战就是构建虚拟FS / GS分段。在Unicorn框架上,您需要构建GDT实体。每个条目的选择器值需要写入每个段寄存器。

以下是GDT条目的结构,您需要使用适当的值来为每个段创造条目。

::: hljs-center

5.png

:::

在gdt.py中,构建GDT条目代码如下所示。

::: hljs-center

6.png

:::

完整的GDT构建代码如下所示。它使用create-gdt-entry来构建每个GDT条目,并将GDT的索引值分配给每个段,最后将选择器值写入每个段寄存器。

::: hljs-center

7.png

:::

进程映像

现在我们已经完成了仿真的基本要求,下一步要做的就是从进程映像中提取内存数据。您可以选择对notepad.exe进行内存转储。有时shellcode会检查特定的进程名或进程环境,则还需要单独针对这些进程进行转储。例如,可以使用Process Explorer对64位的notepad.exe进行内存转储,并将其保存为notepad64.dmp。

ShellcodeEmulator将使用PyKD从进程转储映像中解析和提取有用的组件。提取的组件包括PEB和LDR结构以及已加载的DLL。当shellcode通过dll调用某些API时,可以模拟调用。您还可以提前在shellcode调用的api处进行hook。如果不进行hook,仿真器会在syscall指令处暂停。目前ShellcodeEmulator还没有实现为syscall指令提供仿真。

ShellcodeEmulator

您可以使用git命令安装ShellcodeEmulator(需要Python 3.x环境)
pip install git+https://github.com/ohjeongwook/ShellCodeEmulator
ShellCodeEmulator依赖与windbgtool,您可以使用以下命令进行安装。
pip install git+https://github.com/ohjeongwook/windbgtool --upgrade

用法

安装后,您可以使用-d命令后边接上进程映像的文件名

::: hljs-center

8.png

:::

您可以使用以下命令在64notepad进程映像中运行33312f916c5904670f6c3b624b43516e87ebb9e3.bin shellcode文件。
python -m shellcode_emulator.run 33312f916c5904670f6c3b624b43516e87ebb9e3.bin -d notepad64.dmp
ShellcodeEmulator目前仅支持Windows Shellcode中非常常见的API。当然,您可以根据您的需求,在代码层进行扩展。

开始仿真

当您模拟执行shellcode时,它将显示shellcode执行“ kernel32!WinExec” API。

::: hljs-center

9.png

:::

ShellcodeEmulator目前仅支持Windows Shellcode中非常常见的API。当然,您可以根据您的需求,在代码层进行扩展。

结论

ShellcodeEmulator是一个基本的框架,可以很轻松地对其进行扩展,来支持不同种的shellcode仿真工作。因为它不依赖硬编码的PEB或模型结构,所以您可以轻松地针对不同的shellcode设置不同的内存环境。为了支持更多API仿真,我们还在对框架进行改良。但是作为一种研究工具,Unicorn框架可以很好的应用于现实生活中的防御分析工作。

相关推荐: Spring 自动绑定漏洞

Spring 自动绑定漏洞 0x01:自动绑定 自动绑定功能在很多框架中都有实现,主要功能是允许软件框架自动将HTTP请求中的参数绑定到程序变量或对象中以便于开发者访问。 而自动绑定漏洞的漏洞点在于,攻击者可能将额外的HTTP请求参数绑定到一个对象上,使用这种…