吉沃运营专员 发表于 2022-5-27 11:26:54

Anti-UPX Unpacking 技术

原文 (日语):https://blogs.jpcert.or.jp/ja/2022/03/anti_upx_unpack.html
针对 Windows 操作系统 (PE 格式) 的恶意软件采用了多种混淆和加壳技术,从而使代码分析过程复杂化。另一方面,针对 Linux 的恶意软件 (ELF 格式) 的加壳技术只有少数几种,主要是基于 UPX 的。这篇文章解释了 Anti-UPX Unpacking 技术的详细信息,该技术通常应用于针对 Linux 的恶意软件。

使用 Anti-UPX Unpacking 技术的恶意软件
使用 Anti-UPX Unpacking 技术的最知名恶意软件是 Mirai 及其变种,它们以物联网设备为目标,下图显示了 UPX 打包二进制文件和 Mirai 的标头。正常加了 UPX 壳的是使用 "UPX!" 作为一个魔数,而 Mirai 为每个样本分配不同的值。



经过 UPX 加壳的二进制文件在标头中包含以下信息,通常,只有 "l_magic" 被改变,但 "p_filesize" 和 "p_blocksize" 在一些样本中也是以 0 填充的。

struct l_info       // 12-byte trailer in header for loader (offset 116)
{
    uint32_t l_checksum;
    uint32_t l_magic;    // magic number = "UPX!"
    uint16_t l_lsize;
    uint8_tl_version;
    uint8_tl_format;
};

struct p_info       // 12-byte packed program header follows stub loader
{
    uint32_t p_progid;
    uint32_t p_filesize;
    uint32_t p_blocksize;
};
除了 Mirai 之外,还有许多其他类型的恶意软件使用这种技术,包括 BoSSaBot (2014 年左右出现) 以及最近的一些加密货币挖矿和 SBIDIOT 恶意软件。这也适用于 Lazarus 组织使用的某些类型的恶意软件。下图显示了 ELF-VSingle 的一部分代码,它与该组织相关联。魔数被 "MEMS" 取代。



基于 Anti-UPX Unpacking 技术的二进制文件不能使用普通的 upx 命令进行脱壳。不过,脱其壳其实很简单。在大多数情况下,对此类二进制文件所做的唯一更改是其魔数 "UPX!"。你可以通过将该值更改回 "UPX!" 来使用 upx 命令解压缩它。下图显示了更改魔数以便使用 upx 命令解压缩它的过程。



我们创建了一个工具,可以使用 Anti-UPX Unpacking 技术来对二进制文件进行脱壳。此工具仅用于此目的,否则可能无法正常工作。

JPCERTCC/upx-mod - GitHub https://github.com/JPCERTCC/upx-mod/releases/tag/v4.00-beta



检测 Anti-UPX Unpacking 技术
只需查看代码,就可以手动识别使用这种技术加壳的二进制文件。为了避免疏忽,我们推荐如下基于 Yara 的自动检测。此规则不检测使用普通 UPX 加过壳的二进制文件。

rule upx_antiunpack_elf32 {
   meta:
      description = "Anti-UPX Unpacking technique to magic renamed for ELF32"
      author = "JPCERT/CC Incident Response Group"

   condition:
       uint32(0) == 0x464C457F and
       uint8(4) == 1 and
       (
         (
         for any magic in (uint32(filesize - 0x24)) : (magic == uint32(uint16(0x2C) * uint16(0x2A) + uint16(0x28) + 4)) and
         not for any magic in (0x21585055, 0) : (magic == uint32(uint16(0x2C) * uint16(0x2A) + uint16(0x28) + 4))
         )
         or
         (
         for any magic in (uint32(filesize - 0x24)) : (magic == uint32(uint16be(0x2C) * uint16be(0x2A) + uint16be(0x28) + 4)) and
         not for any magic in (0x21585055, 0) : (magic == uint32(uint16be(0x2C) * uint16be(0x2A) + uint16be(0x28) + 4))
         )
       )
}

rule upx_antiunpack_elf64 {
   meta:
      description = "Anti-UPX Unpacking technique to magic renamed for ELF64"
      author = "JPCERT/CC Incident Response Group"

   condition:
       uint32(0) == 0x464C457F and
       uint8(4) == 2 and
       (
         (
         for any magic in (uint32(filesize - 0x24)) : (magic == uint32(uint16(0x36) * uint16(0x38) + uint16(0x34) + 4)) and
         not for any magic in (0x21585055, 0) : (magic == uint32(uint16(0x36) * uint16(0x38) + uint16(0x34) + 4))
         )
         or
         (
         for any magic in (uint32(filesize - 0x24)) : (magic == uint32(uint16be(0x36) * uint16be(0x38) + uint16be(0x34) + 4)) and
         not for any magic in (0x21585055, 0) : (magic == uint32(uint16be(0x36) * uint16be(0x38) + uint16be(0x34) + 4))
         )
       )
}
结语
许多攻击组使用基于 Anti-UPX Unpacking 技术的恶意软件。对此类恶意软件脱壳很容易,但除非你事先注意到此功能,否则可能会在脱壳过程中浪费时间。当分析加壳的 ELF 二进制文件时,我们建议首先检查它是否使用了 Anti-UPX Unpacking 技术。

页: [1]
查看完整版本: Anti-UPX Unpacking 技术