Linux 的包装器/保护器
单击要下载的工具名称。有些只是源代码,有些只是二进制。使用风险自负。
有4个部分:
- 实验设计,旨在提高 ELF 二进制保护的最新技术水平或用于研究目的
- 由个人项目产生或为娱乐/作为爱好而创建的工具
- 历史上相关的保护器,现已破解/弃用
- 现代保护程序 - 在撰写本文时已知用于“现实世界”的那些,可以这么说(在学术界之外 - 例如在恶意软件中)。
实验/概念验证
dacryfile
(2001)phrack 文章:武装ELF:UNIX 平台上的二进制加密
Dacryfile 是实现以下概念的工具集合。主机文件从段的开头到
.text
段的结尾都被加密.text
。该文件现在具有受加密保护的目标代码和只读数据,而其所有数据和动态对象都可以进行检查。主机文件注入了一个寄生虫,该寄生虫将执行运行时解密。这个寄生虫可以是任意大小,因为它被附加到.data
段的末尾。“寄生代码”是指插入到磁盘上的文件或内存中的进程映像中以更改程序的运行时行为的代码。Silvio Cesare 的文章Unix Viruses (1999)讨论了历史上用于完成这种代码插入的各种技术
将寄生虫代码附加到包含加密代码的 ELF 二进制文件的机制被 grugq 称为“颠覆性动态链接”:
寄生虫本身相当简单,利用颠覆性的动态链接Linux库访问libc函数,利用rc4解密主机。
这种技术在他的文章欺骗 ELF 中有详细介绍,其中写入动态链接的可执行文件的寄生代码能够调用库函数,主要是通过在进程
proc/self/maps
文件中搜索glibc
共享对象加载和卸载函数,然后加载感兴趣的图书馆。
shiva 0.96
(2003)(仅限二进制(受保护))
cryptexec
(2005)phrack 文章:cryptexec:使用按需函数提取的下一代运行时二进制加密。源代码包含在最后。
在这里,运行时解密是通过使用私有堆栈、反汇编器和代码模拟的跟踪功能的组合来完成的,以读取、解密、反汇编然后模拟的 24 字节块。这确保在解密和执行受保护代码时,不超过 24 字节的未加密程序代码驻留在内存中。
跟踪例程维护两个上下文:被跟踪的上下文和它自己的上下文。上下文由 8 个 32 位通用寄存器和标志组成。其他寄存器不会被例程修改。两个上下文都保存在私有堆栈上(也用于调用 C)。
这个想法是从跟踪的程序中一次获取一个指令并在本地执行它们。Intel 指令集的编码相当不规则,因此使用 XDE [5] 反汇编引擎来查找实际操作码和总指令长度。在 FreeBSD(在其动态加载程序中使用带 LOCK 前缀的 MOV 指令)的实验期间,我发现了 XDE 中的一个错误,下面将对其进行描述和修复。
我们在 traced_eip 中维护我们自己的 EIP,将其向下舍入到下一个较低的 8 字节边界,然后将 24 字节解密到我们自己的缓冲区中。然后进行反汇编,控制权通过操作码控制表转移到仿真例程。除控制传输外,所有指令均在本机执行(在适当时间恢复的跟踪上下文中)。单条指令执行后,控制权返回到我们的跟踪程序。
CSPIM
(2010)同样由 Vrba(上述 的设计者
cryptexec
)开发,并在论文Program Obfuscation by Strong Cryptography 中介绍(该论文是付费专区,但代码在 github 和Vrba 的网站上):...我们提出了一种基于代码和数据的强加密与实现 MIPS I 指令集的 CPU 模拟器 (CSPIM) 相结合的程序混淆方法。我们的方法与现有方法的不同之处在于,受保护代码或数据的单个字(32 位)在主存储器中以纯文本形式存在。此外,我们的方法允许从外部向模拟器提供解密密钥。
上图是从增强到基于虚拟机的代码加密器(据我所知,本文没有可用的代码)。
个人项目
cryptelf
(2003) 由 SLACKo通过附加代码来处理运行时解密、更改程序入口点并将
.note
段更改为LOAD
..text
通过将其字节与密钥进行异或来加密该部分。
ELF Encrypter
- 最后更新:2013-03-12似乎依赖经典的运行时代码注入或寄生代码技术来完成运行时解密。
加密文件(由 生成
crypt-7lib program
)将在运行时由共享库解密,共享库直接链接到二进制文件或LD_PRELOAD
在其初始化例程中列出。该套件还包含将纯代码和加密代码注入 ELF 二进制文件的程序。ELF-加密器 0.12
- 改变了数据段感染技术
- 添加了代码以更正节表偏移量
ps2 打包机(2013)
基于UPX。
就像 UPX 一样,这个工具旨在帮助您创建打包的 ELF 以在 PS2 上运行。它采用模块化设计,因此任何人都可以为其编写任何类型的模块。它实际上有一个 zlib 模块、一个 lzo 模块、三个 ucl 模块(n2b、n2d 和 n2e)和一个空模块,仅用于演示目的。
侏儒背包(2014)
Midgetpack 包含两种操作模式:密码和curve25519 密钥交换。
curve25519 是 midgetpack 的真正优势。在此模式下,您不提供任何密码或密钥。而是在打包时生成密钥文件。每次您希望使用二进制文件时都必须使用此密钥文件。当您启动二进制文件时,它会发出挑战并期待响应。您将质询复制/粘贴到 mpkex 工具的输入中,并收到包含二进制加密密钥的响应。此密钥交换受 Curve25519 密钥交换保护,密钥使用 aes-128 加密,整个交换使用 HMAC-SHA256 进行身份验证,以避免一般的中间人攻击。
oplzkwp
(2015)oplzkwp 是一个用于 ELF 混淆的库。它使用 PRESENT 和 blake244 动态加密您的有效负载。只有当前执行的函数在内存中被解密。支持 Linux (x86) 和 Android (ARM)。
pocrypt (2015)
代码证明以演示如何加密二进制文件的一部分。修改后的二进制文件扩展了一个小函数,该函数在运行时解密文件的安全部分以使其执行。
ELF-Packer
(2017)作为家庭作业开发的简单工具。它使用插入到代码洞中的寄生代码来执行目标二进制文件
.text
部分的运行时异或混淆或去混淆。详细信息在简单多态 x86-64 运行时代码段 Crpytor 中讨论。
ELFcrypt (2018)
简单的 ELF 加密器。使用 RC4 加密。
- Ryan O'Neill (@ryan_elfmaster) 的实验。这些可能具有研究价值:
- ELF Packer v0.3 (2009)
- 夏洛克(2014)
- 达芬奇(2015)
- 萨鲁曼(2018)
历史的
burneye
(v1)由 Teso 集团 (2002)cryptexec中给出了以下摘要:使用按需函数提取的下一代运行时二进制加密(更多信息包含在burneye的文档中):
与 Shiva 类似,它具有三层:1)混淆,2)使用 RC4 和 SHA1(用于从密码短语生成密钥)的基于密码的加密,以及 3)指纹识别层。
指纹层是最有趣的一层:收集有关目标系统的数据(例如内存量等)并制成“指纹”。考虑到指纹对可执行文件进行加密,因此生成的二进制文件只能在具有给定指纹的主机上运行。有两种指纹识别选项:
可以指定指纹容差,以便允许小偏差。这样,例如,可以在目标系统上升级内存并且可执行文件仍然可以工作。如果指纹的差异数量太大,程序将无法运行。
Seal:使用此选项生成的程序将在任何系统上运行。但是,第一次运行时,它会创建主机的指纹并将自身“密封”到该主机上。原始密封二进制文件随后被安全删除。
当程序执行过程中设置了某个环境变量时,也可以使加密的二进制文件自行删除。
objobf
又名 Burneye2 (2003)它读取一个 ELF 可重定位目标文件并生成一个功能等效的输出文件,该文件是输入文件的混淆版本。为此,
objobf
将文件中的所有函数分解为基本块级别。此表示用于修改代码,同时保持其语义等效。这涉及数据流分析和基本块转换。之后,作为控制流图的基本块表示被线性化为一个新的目标文件,该文件是从头开始创建的。
-
实现可执行压缩和加密。基于 UPX 和
burneye
.ELFuck 使用了出色的 Markus FXJ Oberhumer 压缩算法 NRV2E,它使用微型解压缩器(大约 128 字节!)进行非常好的压缩。该算法族是从UPX盗来的,不同之处在于解压是实时进行的;ELFuck 会将 ELF 直接解压到 .text/.data 段并从那里执行真实的 ELF 图像,另一方面,UPX 在 /tmp 和 execve() 中创建原始 ELF,因此我们根本不需要任何可写的文件系统。
因为 ELFuck 是 100% 基于窃取的想法,所以我也实现了这个 BurnEye。有人可能希望禁止其他用户使用/分析您的二进制文件(公共 shell、root 浏览用户的家)。该算法有点简单,但似乎非常有效:我们将选择一些密码;使用 sha1 将其扩展为 160 位密钥。通过这个密钥,我们将使用 RC4 算法加密整个二进制文件(当然,解密存根除外)。我们还将针对原始二进制文件保留 sha1 的最后 32 位,以检查密码。当有人将执行此类受保护的二进制文件时;存根将询问密码,对其进行散列并尝试使用此密钥解密二进制文件。然后我们将对可能解密的二进制文件进行散列,根据我们在创建时保存的值检查它,如果匹配,
现代的
大多数现代 ELF 二进制文件都使用 UPX 或其变体进行保护。1,2
- 在野外使用的 UPX 加壳器的最简单变体是'LSD' 加壳器,其中字符串 'UPX' 更改为 'LSD'。这方面的一个例子是用 Go 编写的XMR 硬币矿工,它针对运行 Jenkins 的系统。
mumblehard
自定义保护器 - 不基于 UPX整个打包机实际上由大约 200 条组装指令组成。另一个值得注意的观察结果:系统调用是通过使用
int 80h
指令直接进行的。它是用汇编编写的另一个提示是函数没有通常的序言来管理堆栈。通过使用中断进行系统调用,Mumblehard ELF 二进制文件避免了任何外部依赖。此外,该打包程序适用于 Linux 和 BSD 系统。1样品:
- 20b567084bcc6bd5ac47b2ab450bbe838ec88fc726070eb6e61032753734d233
- 78c19897d08e35c0e50155c87f501e20f2d1dbfd38607fc8e12711d086d52204
- 84dfe2ac489ba41dfb25166a983ee2d664022bbcc01058c56a1b1de82f785a43
- 747d985d4bd302e974474dc9ab44cb1f60cb06206f3639c5d603db94395b877b
- 9512cd72e901d7df95ddbcdfc42cdb16141ff155e0cb0f8321069212e0cd67a8
- a5915c3060f5891242514b7899975393ef3d3cb87b33b6a767cffce4feac215f
tiny XMR mooner
根据 r2con 2018 演示Unpacking the Non-Unpackable使用自定义包装器的变体。- 8a0d9c84cfb86dd1f8c9acab87738d2cb82106aee0d88396f6fa86265ff252dd
演示文稿中的 md5sum:
4f1fdacaee8e3c612c9ffbbe162042b2
请注意,此特定文件是“Tiny XMR Mooner”Linux 加密矿工恶意软件(sha256 总和相同)的主题,但在此分析中未提及打包或任何其他形式的二进制保护。
Linux/Tsunami
带定制包装机- Malshare 样本
- f22ffc07e0cc907f00fd6a4ecee09fe8411225badb2289c1bffa867a2a3bd863(Virustotal)
- pwning.fun上曾经有一个分析可用,但看起来它已被删除。
附加信息
用于混淆的自修改代码分类法(2011) 简要总结了其中一些工具并讨论了各种混淆技术。
参考
拆箱 Linux/Mumblehard (2015) - ESET