欢迎进Allbet欧博网址,欧博网址是欧博集团的官方网站。Allbet欧博网址开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

首页科技正文

Metasploit 天生的 Shellcode 的导入函数剖析以及执行流程剖析(上)

admin2021-09-1435技术

2021 年 4 月,研究职员深入剖析了 Cobalt Strike渗透测试手艺,以及它的一些署名规避手艺是若何在检测手艺下失效的。在本文中,我们将深入讨论Metasploit,这是一个可以与Cobalt Strike互操作的常用框架。

在本文中,我们将讨论以下主题:

shellcode的导入剖析——Metasploit shellcode若何定位来自其他DLL的函数,以及我们若何预先盘算这 zhe[些值来剖析来自其他有用『yong』载荷变体的任何导入;

逆向shell的执行流程——该历程异常简朴;

损坏 Metasploit 导入剖析——一种非侵入性诱骗手艺(不涉及钩子),让 Metasploit 以高可信度通知防病毒软件 (AV)。

对于这个剖析,研究职员在 v6.0.30-dev 版本下使用 Metasploit 天生了研究职员《yuan》自己的 shellcode。使用以下下令天生的恶意样本的效果为 3792f355d1266459ed7c5615dac62c3a5aa63cf9e2c3c0f4ba036e6728763903 的 SHA256 哈希值,而且可以在 VirusTotal 上找到,供愿意自己实验的读者使用。

msfvenom -p windows/shell_reverse_tcp -a x86 > shellcode.vir

在整个剖析“xi”历程中,我们重新命名了函数、变量和偏移量,以反映它们的作用并提高清晰度。

开端剖析

在本节中,研究职员将概述确定下一步剖析(导入剖析和执行流剖析)所遵照的初始逻辑。

虽然典型的可执行文件包罗一{yi}个或多个入口点(导出的函数、TLS 回调{diao}等),但 shellcode 可以被视为最原始的代码花样,其中初始执行从第一个字节最先(xian)。

从初始字节剖析天生的 shellcode 概述了两个操作:

从剖析的角度来看,①处的第一条指令可以忽略。cld操作祛除偏向标志,确保字符串数据是向前读取而不是向后读取(例如:cmd与dmc的区别)。② 处的第「di」二个挪用操作将执行转移到研究职员命名为 Main 的函数中,该函数将包罗 shellcode 的主要逻辑。

挪用 Main 函数的反汇编 shellcode

在Main函数中,我们考察到分外的挪用【yong】,好比下图中突出显示的四个挪用『yong』(③、④、⑤和⑥)。这些挪用针对一个尚未识其余函数,其地址存储在ebp寄存器中。要明白这个函数的位置,我们需要退后一步并领会挪用指令的操作方式。

Main 函数的反汇编

挪用指令通过执行两个操作将执行转移到目的目的地:

它将返回地址(位于挪用指令之后的指令的内存地址)压入客栈。该地址稍后可以被 ret 指令用于将执行从被挪用函数(被挪用者)返回到挪用函数(挪用者);

它将执行转移到目的目的地(被挪用者),就像 jmp 指令一样;

因此,来自Main函数③的第一个pop指令将挪用者的返回地址存储到ebp寄存器中。这个返回地址随后被作为函数挪用,在偏移量0x99、0xA9和0xB8(④、⑤和⑥)处挪用。这种模式,在每次挪用之前泛起类似的推送,往往解释存储在 ebp 中的返回地址是动态导入剖析函数。

“通俗”可执行文件(例如:Windows上的可移植可执行文件)包罗需要的信息,因此,一旦被操作系统(OS)加载程序加载,代码就可以挪用导入的例程,好比那些来自Windows API的例程(例如:LoadLibraryA)。为了实现此默认行为,可执行文件应具有操作系统可以注释的特定结构。由于shellcode是代码的一个基本版本(它没有预期的结构),操作系统加载程序无法辅助它剖析这些导入的函数,更严重的是,操作系统加载程序将无法“执行”shellcode文件。为领会析这个问题,shellcode 通常会执行“动态导入剖析”。

执行“动态导入剖析”的最常见手艺之一是对每个可用的导出函数举行哈希,并将其与所需导入的哈希举行对照。由于shellcode开发者不能总是展望一个特定的DLL(例如:ws3_32.dll for Windows Sockets)及其导出是否已经加载,考察shellcode加载DLL并不罕有,首先挪用LoadLibraryA函数(或它的一个替换方式)。在挪用其他dll的导出之前依赖于LoadLibraryA(或替换)是一种稳固的方式,由于这些库加载函数是kernel32.dll的一部门,是少数几个可以加载到每个历程中的 DLL 之一。

为了证实研究职员的上述理论,研究职员可以搜索所有挪用指令,如下图所示(例如:在搜索菜单下使用 IDA 的文本等选项)。除了第一次挪用 Main 函数外,所有实例都引用 ebp 寄存器。这一考察效果与研究职员将在下一节中〖zhong〗考察到的众所周知的常量一起,支持了研究职员的理论,即存储在 ebp 中的地址持有一个指向执行动态导入剖析的函数的指针。

shellcode中的所有挪用指令

对ebp寄存器的大量挪用解释它确实持有一个指向导入剖析函数的指针,我们现在知道该函数位于对Main的第一次挪用之后。

导入剖析方案剖析

到现在为止,我们注重到在最初挪用Main之后的指令起到了至关主要的作用,由于我们希望‘wang’它成为导入剖析例程。在剖析shellcode的逻辑之前,让我们先剖析这个剖析例程,由于它将简化对其余挪用的明白。

从导入哈希到函数

直接位于Main初始挪用之后的代码是导入剖析最先的地方,要剖析这些导入,例程首先定位加载到内存中的模块列表,由于这些模块包罗它们可用的导出函数。

为了找到这些模块,一种常用的shellcode手艺即是与Process Environment Block(简称PEB)举行交互。

在盘算历程中,历程环境块(缩写为 PEB)是 Windows NT 操作系统家族(zu)中的一种数据结构。它是操作系统内部使用的不透明数据结构,其大部门字段不供操作系统以外的任何其他使用。PEB包罗应用于整个历程的数据结构,包罗全局上‘shang’下文、启动参数、程序映像加载程《cheng》序的数据结构、程序映像基地址,以及用于为整个历

  • 程的数据结构提供互斥的同步工具。

    如下图所示,为了接见PEB, shellcode接见线程环境块(TEB),它可以通过寄存器(⑦)立刻接见。TEB结构自己包罗指向PEB(⑦)的指针。在PEB中, shellcode可以定位PEB_LDR_DATA结构(⑧),它反过来包罗对多个双链接模块列表的引用。正如在(⑨)中所考察到的,Metasploit shellcode行使这些双链列表(InMemoryOrderModuleList)中的一个来随后遍历包罗已加载模块信息的LDR_DATA_TABLE_ENTRY结构。

    一旦识别{bie}出第一个模块,shellcode 在⑩ 处检索模块的名称(BaseDllName.Buffer)和在⑪ 处的缓冲区的最大长度(BaseDllName.MaximumLength),这是必须的,由于缓冲区不能保证以 NULL 末尾。

    初始模块检索的反汇编

    值得强调的一点是,与通常的指针(TEB.ProcessEnvironmentBlock、PEB.Ldr 等)相反,双链表指向下一项〖xiang〗的列表条目。这意味着列表中的指针将指向非零偏移量,而不是指向结构的起始位置。因此,虽然在下(xia)图中(zhong) LDR_DATA_TABLE_ENTRY 在偏移量为 0x2C 处具有 BaseDllName 属性,但从列表条目的角度来看,偏移量为 0x24 (0x2C-0x08)。这可以在上图中考察 cha[到,其中必须减去 8 的偏移量才气接见 ⑩ 和 ⑪ 处的两个 BaseDllName 属性。

    新2手机管理端{duan}网址

    www.9cx.net)实时更新发布最新最快最有效的新2手机管理端网址,包括新2手机网址,新2备用网址,皇冠最新网址,新2足球网址,新《xin》2网址大全。

    从TEB到BaseDllName

    恢复了DLL名称的缓冲区和最大长度后,shellcode继续天生一个哈希。为此,shellcode对最台甫称长度内的每个ASCII字符执行一组如下操作:

    若是字符是小写的,它会{hui}被修改为大写。该操作是凭证字符的ASCII示意来执行的,这意味着若是值是0x61或更高(a或更高),就会减去0x20以进入大写【xie】局限;

    天生的哈希(最初为0)向右旋转13位(ROR) (0x0D);

    大写字符被添加到现有哈希中;

    形貌KERNEL32.DLL的第一个字符(K)的哈希循环的模式

    在牢靠的注册表巨细(在edi的情形下是32位)上重复旋「xuan」转和添加,字符最终将最先重叠。这些重复和重叠的组合使操作不能逆,因此发生给命名称的32位哈希/校验和。

    一个有趣的发现是,虽然LDR_DATA_TABLE_ENTRY中的BaseDllName是unicode编码的(每个字符2个字节),但代码通过使用 lodsb(见⑫)将其视为 ASCII 编码(每个字符 1 个字『zi』节)。

    模块名称哈希例程的反汇编

    哈希天生算法可以在Python中实现,如下面的代《dai》码片断所示。虽然我们前面提到过,凭证 Microsoft 文档,BaseDllName 的缓冲区不需要以 NULL 终止,但大量测试解释,NULL 终止总是云云,而且通常可以假设。这个假设是使 MaximumLength 属性成为有用界限的缘故原由,类似于 Length 属性。因此,以下代码片断期望转达给 get_hash 的数据是一个由以null末尾的Unicode字符串天生的Python 字节工具。

    上述函数可用于盘算 KERNEL32.DLL 的哈希值,如下所示。

    天生 DLL 名称的哈希后,shellcode 继续识别所有导出的函数。为此,shellcode 首先检索 LDR_DATA_TABLE_ENTRY 的 DllBase 属性(⑬),该属性指向 DLL 的内存地址。此时,IMAGE_EXPORT_DIRECTORY 结构通过遍历可移植可执行文件的结构(⑭ 和 ⑮)并将相对偏移量添加到 DLL 的内存中基地址来识别。最后一个结构包罗导出函数名称的数目(⑰)以及指向这些名称的指针表(⑯)。

    导出检索的反汇编

    上述操作的架构如下,其中虚线示意从相对偏移量盘算出的地址,该偏移量‘liang’增添了 DLL 的内存基地址。

    从LDR_DATA_TABLE_ENTRY到IMAGE_EXPORT_DIRECTORY

    一旦确定了导着名称的数目及其指针,shellcode 就会按降序枚举该表。详细就是,名称的(de)数目用作⑱处的递减计数器。对于每个导出函数的名称而且没有匹配,shellcode 执行一个哈希例程(⑲上的hash_export_name),与研究职员之前考察到的类似,唯一的区别是保留了字符巨细写(hash_export_character)。

    最后的哈希是通过将最近盘算的函“han”数哈希(ExportHash)添加到⑳处之前获得的模块哈希(DllHash)中获得的。这是在追求哈希和㉑之间的区别,除非他们匹配,否则操作重新最先下【xia】一个函数。

    导着名称哈希的反汇编

    若是导出的函数都不匹配,例程将在InMemoryOrderLinks双链表中检索下一个模块,并再次执行上述操作,直到找到匹配项。

    反汇编到下一个模块的循环历程

    上面的遍历双链表的架构如下图所示:

    遍历InMemoryOrderModuleList

    若是找到匹配,shellcode将继续挪用导出的函数。早年面确认IMAGE_EXPORT_DIRECTORY检索其地址,代码将首先需要映射函数的名字的顺序(㉒),顺序导出数目。一旦顺序从AddressOfNameOrdinals表中恢复过来,地址可以通过使用序数AddressOfFunctions表中的索引(㉓)。

    导入“挪用”的反汇编

    最后,一旦导出的地址被恢复,shellcode通过确保返回地址首先在客栈上(删除它正在在㉔搜索的哈希)来模拟挪用行为,其次是所有参数凭证默认的Win32 API __stdcall挪用协定(㉕)。然后裔{yi}码在 ㉖ 处执行 jmp 操作,将执行转『zhuan』移到动态剖析的导入,在返回时,将从初始挪用 ebp 操作发生的位置恢复。

    总的来说,可以将动态导入剖析架构为嵌套循环。主循环根据内存中的顺序遍历模块(下图中的蓝色),而对于每个模块,第二个循环遍历导出函数,在所需的导入和可用的「de」导出(chu)之间寻找匹配的哈希(下图中的红色)。

    导入剖析流

    本文翻译自:https://blog.nviso.eu/2021/09/02/anatomy-and-disruption-of-metasploit-shellcode/

    新2会员手机管理端

    新2会员手机管理端www.22223388.com)实时更新发布最新最快的新2代理线路、新2会员线『xian』路、新2备用登录网址、新2会员手机管理端、新2手机版登录网址、新2皇冠登录网址。

  • 网友评论