我想知道是否有人遇到过可用于ELF二进制文件的打包程序/保护程序。似乎有很多关于为PE格式编写打包程序和保护程序的文章-但是,对于Linux来说似乎没有很多。已经碰到过1,这似乎是SMC的非常基本(但简洁)的介绍。 br />

#1 楼

除了classix UPX,您还应该看看Burneye(及其饼干,UNFburninhell和Burndump)和elfuck。它们很老,但是仍然很有趣。

如果您对可以使用的技巧感兴趣,这是aczid的一个很好的介绍,我也建议使用二进制保护方案以获得更完整的概述。

有人还向CanSecWest展示了一个名为Shiva的包装机,该包装机在Blackhat处被破坏。不幸的是,没有可用的资源。

评论


此列表有任何更新吗?除UPX外,列出的内容确实很旧,无法维护。

– K
16年1月22日在4:06

如果您不耐烦,可以自己写;)

– jvoisin
16年1月26日在17:40

不幸的是,上面的许多链接似乎不再起作用。

– Rui F Ribeiro
18年1月24日在21:03

#2 楼

UPX是可用于ELF二进制文件的开源打包程序。

#3 楼

单击工具名称进行下载。一些将仅是源代码,其他仅是二进制。使用风险自负。


共有4个部分:实验设计,旨在提升ELF的最新水平二进制保护或用于研究目的
由个人项目产生的工具或为娱乐/作为爱好而创建的工具。
历史上相关的保护器,现在已被破解/弃用
现代保护器-在撰写本文时已知可以这么说(在学术界之外-例如在恶意软件中)。


实验/概念证明



dacryfile(2001)

短篇文章:加固ELF:UNIX平台上的二进制加密
实现以下概念。
主机文件从.text节的开始一直加密到.text段的末尾。现在,该文件具有其目标代码和受加密保护的只读数据,而其所有数据和动态对象均已开放供检查。宿主文件中注入了寄生虫,该寄生虫将执行运行时解密。该寄生虫可以具有任意大小,因为它被附加到.data段的末尾。


“寄生代码”是指为了更改程序的运行时行为而插入磁盘上的文件或内存中的过程映像的代码。 Silvio Cesare的文章Unix Viruses(1999)中讨论了历史上用来完成这种代码插入的各种技术。由grugq称为“颠覆动态链接”:链接Linux库以访问libc函数,并通过rc4链接来解密主机。基本上可以通过在进程的proc/self/maps文件中搜索glibc的共享库加载和卸载函数来调用库函数,然后加载感兴趣的库。
br />
shiva 0.96(2003)(仅二进制文件(受保护))


简介演示文稿

失败演示文稿

实现以下功能:


外部混淆层可防止静态分析
AES加密的受密码保护的中间层
内部加密层由可能是内存的加密块组成-按需映射
TRAP标志检测,以防止单步执行
分叉,然后使进程相互之间ptrace(),从而防止PTRACE_ATTACH
跳入指令的中间部分
抓住了SIGTRAP
定时检查
INT3指令替换

除了这些演示文稿之外,除在phrack文章中进行一些讨论外,很难找到其他信息。在ELF运行时加密/解密上。没有可用的源代码,只有二进制文件受保护。








cryptexec(2005)破解文章:cryptexec:使用按需函数提取的下一代运行时二进制加密。源代码包含在末尾。

运行时解密是通过结合使用私有堆栈的跟踪功能,反汇编程序和代码仿真来读取,解密并读取24个字节的块来完成的,分解后进行仿真。这样可以确保在解密和执行受保护的代码时,内存中不超过24个字节的未加密程序代码。


跟踪例程维护两个上下文:被跟踪的上下文和它自己的上下文。上下文由8个32位通用寄存器和标志组成。该例程不会修改其他寄存器。
这两个上下文都保存在私有堆栈中(也用于
调用C)。

想法是获取一个一次从跟踪的
程序中获取指令,并在本地执行它们。英特尔指令集具有相当大的
不规则编码,因此XDE [5]反汇编器引擎用于查找实际操作码和总指令长度。在
FreeBSD(在其动态加载程序中使用LOCK前缀的MOV指令)的实验中,我发现了XDE中的一个错误,下面对此进行了描述和修复。

我们维护自己的在traced_eip中将EIP向下舍入到下一个较低的8字节边界,然后将24字节解密到我们自己的缓冲区中。然后
进行反汇编,并将控制权通过操作码控制表转移到仿真例程。除控制
传输外,所有指令均本地执行(在可追溯的上下文中,该上下文将在适当的时间恢复)。执行单条指令后,控件
返回到我们的跟踪例程。







CSPIM(2010)

还由Vrba(上述cryptexec的设计者)开发,并在论文《强密码的程序混淆》中进行了介绍(该论文位于付费专区,但代码在github和Vrba的站点上): />

...我们提出一种程序混淆方法,该方法基于对代码和数据的高度加密以及实现MIPS I指令集的CPU仿真器(CSPIM)的结合。我们的方法与现有方法的不同之处在于,在主内存中只有一个字(32位)的受保护代码或数据以纯文本形式出现。此外,我们的方法允许将解密密钥从外部提供给模拟器。




上图是从增强功能到基于虚拟机的代码
加密器(据我所知,本文没有可用的代码) )。



个人项目



cryptelf(2003)by SLACKo

通过添加代码以处理运行时解密,更改程序入口点并将.note段更改为LOAD来修改二进制文件。通过将其字节与密钥异或来加密.text节。





ELF Encrypter-最近更新:2013-03-12

似乎依赖于经典的运行时代码注入或寄生代码技术来完成运行时解密。


加密文件(由crypt-7lib program生成)将在运行时由共享库解密,该共享库直接链接到二进制文件或在LD_PRELOAD中列出,在初始化例程期间。该套件还包含用于将纯代码和加密代码注入ELF二进制文件的程序。

ELF-Encrypter 0.12


更改了数据段感染技术
纠正节表偏移量的代码




ps2-packer(2013)

基于UPX。


就像UPX一样,该工具旨在帮助您
创建打包的ELF以在PS2上运行。它具有模块化设计,因此任何人都可以
向其编写任何类型的模块。它实际上有一个zlib模块,一个lzo模块,
三个ucl模块(n2b,n2d和n2e)和一个null模块(仅用于演示目的)。







midgetpack( 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部分执行运行时XOR模糊处理或反模糊处理。有关详细信息,请参见简单多态x86-64运行时代码段Crpytor。






ELFcrypt(2018)


简单的ELF加密程序。使用RC4加密。





瑞恩·奥尼尔(@ryan_elfmaster)的实验。这些可能具有研究价值:



ELF Packer v0.3(2009)

达文西(2015)

萨鲁曼(2018)



历史



burneye(v1),由Teso组(2002)提供。 ):


与Shiva相似,它具有三层:1)混淆,2)使用RC4和SHA1(用于从密码短语生成密钥)的基于密码的加密,以及3)指纹层。

指纹层是最有趣的层:收集有关目标系统的数据(例如内存量等),并将其制成
'指纹'。可执行文件已加密,并考虑了指纹,因此生成的二进制文件只能在具有给定指纹的主机上运行。有两个指纹选项:


可以指定指纹公差,以便允许小的偏差。这样,例如,可以在目标系统上升级内存,并且可执行文件仍然可以工作。如果指纹上的
差异数量太大,则该程序将无法运行。
封印:使用此选项生成的程序将在任何系统上运行。
但是,这是第一次它运行后,会创建
主机的指纹并将其自身“密封”到该主机。原始的密封二进制文件随后被安全删除。

在程序执行过程中设置了某个
环境变量时,也可以使加密的二进制文件删除自身。 objobf aka burneye2(2003)


读取一个ELF可重定位目标文件和
产生功能等效的输出文件,该文件是输入文件的混淆版本。为此,objobf将文件中的所有功能分解为基本块级别。此表示形式用于使代码变异,同时保持语义上的等效。这涉及数据流分析和基本块转换。然后,将作为控制流程图的基本块表示形式线性化为一个新的目标文件,该文件将从头创建。







elfuck

实现可执行压缩和加密。基于UPX和burneye



ELFuck使用出色的MarkusF.X.J。 Oberhumer的压缩算法,
NRV2E,使用微小的解压缩器
(大约128个字节!)可以很好地进行压缩。该算法系列是从UPX窃取的,不同之处在于实时解压缩; ELFuck
直接将ELF解压缩到.text / .data段,然后从那里执行真实的
ELF图像,另一方面,UPX在/ tmp
中创建原始的ELF并对其执行execve(),因此我们根本不需要任何可写的文件系统。


因为ELFuck是100%基于偷来的思想,所以我也实现了BurnEye的这个。有人可能会禁止其他用户
使用/分析您的二进制文件(公共外壳,以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演示使用自定义包装器。



8a0d9c84cfb86dd1f8c9acab87738d2cb82106aee0d88396f6fa86265ff252dd

md5sum来自演示文稿:4f1fdacaee8e3c612c9ffbbe162042b2

请注意,该特定文件是“ Tiny XMR mooner” Linux cryptominer恶意软件的主题(sha256的总和是相同的),但在分析打包或任何其他形式的二进制保护时未提及。






Linux/Tsunami带自定义包装器


Malshare样品

f22ffc07e0cc907f00fd6a4ecee09fe8411225badb2289c1bffa867a2a3bd863(病毒总数)
以前在pwning.fun上可以进行分析,但看起来好像已被删除。

用于混淆的自修改代码分类法(2011)简要总结了其中一些工具,并讨论了多种混淆技术。 >
了解Linux恶意软件
暴露的现代Linux恶意软件
拆箱Linux / Mumblehard(2015)-ESET