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]