DecoyMini 技术交流社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3112|回复: 0

[技术前沿] Anti-UPX Unpacking 技术

[复制链接]

172

主题

34

回帖

30

荣誉

Rank: 9Rank: 9Rank: 9

UID
2
积分
339
精华
1
沃币
2 枚
注册时间
2021-6-24

论坛管理

发表于 2022-5-27 11:26:54 | 显示全部楼层 |阅读模式

针对 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 填充的。

  1. struct l_info       // 12-byte trailer in header for loader (offset 116)
  2. {
  3.     uint32_t l_checksum;
  4.     uint32_t l_magic;    // magic number = "UPX!"
  5.     uint16_t l_lsize;
  6.     uint8_t  l_version;
  7.     uint8_t  l_format;
  8. };

  9. struct p_info       // 12-byte packed program header follows stub loader
  10. {
  11.     uint32_t p_progid;
  12.     uint32_t p_filesize;
  13.     uint32_t p_blocksize;
  14. };
复制代码

除了 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 加过壳的二进制文件。

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

  5.      condition:
  6.        uint32(0) == 0x464C457F and
  7.        uint8(4) == 1 and
  8.        (
  9.          (
  10.            for any magic in (uint32(filesize - 0x24)) : (magic == uint32(uint16(0x2C) * uint16(0x2A) + uint16(0x28) + 4)) and
  11.            not for any magic in (0x21585055, 0) : (magic == uint32(uint16(0x2C) * uint16(0x2A) + uint16(0x28) + 4))
  12.          )
  13.          or
  14.          (
  15.            for any magic in (uint32(filesize - 0x24)) : (magic == uint32(uint16be(0x2C) * uint16be(0x2A) + uint16be(0x28) + 4)) and
  16.            not for any magic in (0x21585055, 0) : (magic == uint32(uint16be(0x2C) * uint16be(0x2A) + uint16be(0x28) + 4))
  17.          )
  18.        )
  19. }

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

  24.      condition:
  25.        uint32(0) == 0x464C457F and
  26.        uint8(4) == 2 and
  27.        (
  28.          (
  29.            for any magic in (uint32(filesize - 0x24)) : (magic == uint32(uint16(0x36) * uint16(0x38) + uint16(0x34) + 4)) and
  30.            not for any magic in (0x21585055, 0) : (magic == uint32(uint16(0x36) * uint16(0x38) + uint16(0x34) + 4))
  31.          )
  32.          or
  33.          (
  34.            for any magic in (uint32(filesize - 0x24)) : (magic == uint32(uint16be(0x36) * uint16be(0x38) + uint16be(0x34) + 4)) and
  35.            not for any magic in (0x21585055, 0) : (magic == uint32(uint16be(0x36) * uint16be(0x38) + uint16be(0x34) + 4))
  36.          )
  37.        )
  38. }
复制代码

结语


许多攻击组使用基于 Anti-UPX Unpacking 技术的恶意软件。对此类恶意软件脱壳很容易,但除非你事先注意到此功能,否则可能会在脱壳过程中浪费时间。当分析加壳的 ELF 二进制文件时,我们建议首先检查它是否使用了 Anti-UPX Unpacking 技术

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|DecoyMini 技术交流社区 ( 京ICP备2021005070号 )

GMT+8, 2024-5-7 01:39 , Processed in 0.060873 second(s), 26 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表