来自 DDOS 2022-05-12 12:00 的文章

ddos盾_cdn能防ddos么_无限

ddos盾_cdn能防ddos么_无限

Win32/64:Blackbeard&鸽子:64位Windows中的隐身技术,第2部分

上周我们承诺详细解释"Blackbeard"特洛伊木马如何渗透并隐藏在受害者的系统中,尤其是其64位变体。这篇博客文章中描述的一切都发生在鸽子(clickbot负载)下载和执行之前。最有趣的方面是它绕过Windows的用户访问控制(UAC)安全功能,将下载程序的32位代码转换为有效负载的64位代码。最后,持久性是如何实现的。

与几乎所有其他恶意软件一样,此下载程序用密码器封装。在删除第一层加密程序后,我们可以看到下载程序是以健壮的方式编写的。相同的代码可以在32位或64位环境下运行,而代码本身根据未打包层的入口点动态地决定这一环境。因此,作者可以将其下载程序封装在32位或64位密码器中,并在两种环境中都能很好地执行。

首先,我们注意到一系列push、pop、rol、test和jnz指令。这些指令在不同的环境中运行时,会产生不同的结果。根据结果,条件跳转要么被执行,要么不被执行。这些初始指令同时在32位和64位环境中运行。第一次跳转(JNZ)后有两个分支,一个在32位和WoW64环境中运行,另一个在64位环境中运行。

在64位环境下,值0x40000000被推入RCX寄存器。即使向左旋转2个位置,ECX仍然保持为零(设置了ZF),因此不会进行JNZ跳跃。因此执行64位代码。Downloader只需获取其映像基,添加64位有效负载函数的相对虚拟地址并执行它。

在32位环境值下,0x40000000被推入ECX寄存器,然后向左旋转2个位置,使ECX保持值1。指令测试ECX,ECX未设置零标志(ZF),因此,采取JNZ跳转并执行32位代码分支。

32位应用程序可在32位或64位操作系统上执行。要确定处理器体系结构是什么,下载程序调用GetNativeSystemInfo函数。预期结果为0x00,代表处理器体系结构英特尔(x86)或0x09,代表处理器体系结构AMD64(x64)。

下面的代码解析GetNativeSystemInfo函数的地址并调用它。然后比较WPProcessorArchitecture信息(0x4010e0)。如果检测到x86体系结构,海外高防cdn,则不采用地址0x4010ee处的JNZ,并执行Win32中的函数。如果检测到x64体系结构,则采用地址0x4010ee处的JNZ,并执行从地址inWoW64开始的代码。

在64位操作系统上执行32位应用程序时,32位应用程序在32位操作系统的仿真中运行,该操作系统在Windows64上称为Windows(简称为WoW64)。WoW64拦截32位应用程序发出的系统调用,将32位数据结构转换为64位数据结构,并调用64位系统调用。64位系统调用完成后,它将所有输出数据结构从64位转换回32位数据结构。WoW64子系统使用三个动态链接库实现:WoW64.dll、Wow64win.dll和WoW64.cpu.dll。Wow64.dll负责从32位到64位的转换,Wow64win.dll提供32位应用程序的入口点,Wow64cpu.dll提供将处理器从32位模式切换到64位模式的功能。downloader的有趣部分从地址0x40112c开始,在地址0x401000处调用函数。

注意函数的第二个参数0xad70。稍后将在本分析中使用它。

被调用函数随后解析上述三个基本WoW64 dll库的基址。除此之外,它还从Wow64win.dll-sdwhwin32JumpTable检索重要结构的虚拟地址。

使用WinDBG的lm命令显示所有基本WoW64模块的内存范围。

在0x40105f,它解析GDI32的地址!BRUSHOBJ_hGetColorTransform,它是从gdi32.dll库导出的函数。解析的地址存储在EBX寄存器中。稍后,在0x401066,从调用的第一条指令中提取系统调用序号。

如果我们想获得sdwhwin32JumpTable中函数的地址,首先从其序号中减去0x1000,然后将其乘以8(在64位系统中,每个指针有8个字节),并将其添加到sdwhwin32JumpTable表的开头。在我们的例子中,0x78bbfae0+0x129*8=0x78bc0428。

下图显示了存储在sdwhwin32JumpTable中的BRUSHOBJ_hGetColorTransform的地址。

但是,在分析的下载程序中,会发生更隐蔽的情况。在0x401083,与BRUSHOBJ_hGetColorTransform相对应的sdwhwin32JumpTable中的地址被用户指定的地址覆盖(0x40ad70)。请参见以下两幅图,这两幅图代表了覆盖完成前后的描述情况。

然后我们执行CALL EBX(0x40108a),它应该执行BRUSHOBJ_hGetColorTransform。然后,我们可以将[0xI64A]转换为COLORC0F.dll,其中的COLORC0F.dll是[0xI64A],我们可以将其转换为COLORC0F.dll!x86SwitchTo64位模式。

地址fs:[0x0c0]处的Dword包含一个跳转导致切换到64位环境的地址(段0033h确定64位环境)。

64位环境从wow64cpu开始!CpupReturnFromSimulatedCode,其中包含对Wow64SystemServiceEx的调用。

在调用Wow64SystemServiceEx之前,传递了几个有趣的参数:0x7559fae0是wow64win.dll中sdwhwin32JumpTable的开头;0x129是sdwhwin32JumpTable中BRUSHOBJ_hGetColorTransform的序号;0x766e5c55是GDI32.dll中BrushGetColorTransform的开始。

在Wow64SystemServiceEx中,计算并调用sdwhwin32JumpTable中BrushGetColorTransform的地址,并在0x755bcf84(调用r12)。将执行修补地址中的代码,而不是原始地址。

此时,将执行加载程序中的64位有效负载。64位有效负载从地址0x40ad70开始。