Linux 的包装器/保护器

逆向工程 linux 小精灵 包装工
2021-06-23 21:31:37

我想知道是否有人遇到过可用于 ELF 二进制文件的打包程序/保护程序。似乎有很多关于为 PE 格式编写包装器和保护器的文章——但是,对于 Linux 的文章似乎并不多。

这只是一种爱好,到目前为止我遇到了1这似乎是对 SMC 的一个非常基本(但简洁)的介绍

是否有任何资源/源代码可以指给我,我可以参考和学习?

3个回答

除了 classix UPX 之外,您还应该看看Burneye(及其破解程序UNFburninhellBurndump)和 elfuck。他们已经很老了,但仍然很有趣。

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

有人还提出了一个的CanSecWest名为包装湿婆这是在打破黑帽不幸的是,没有可用的资源。

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

单击要下载的工具名称。有些只是源代码,有些只是二进制。使用风险自负。


有4个部分:

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

实验/概念验证

  • 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)(仅限二进制(受保护))

    • 介绍介绍
    • 击败介绍

      实现以下功能:

      • 外部混淆层阻止静态分析
      • AES 加密、密码保护的中间层
      • 由加密块组成的内部加密层,可以按需进行内存映射
      • 防止单步执行的 TRAP 标志检测
      • 分叉然后ptrace()相互处理,这防止了 PTRACE_ATTACH
      • 跳转到指令的中间
      • 捕获 SIGTRAP
      • 计时检查
      • INT3指令替换

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


  • 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 位)在主存储器中以纯文本形式存在。此外,我们的方法允许从外部向模拟器提供解密密钥。

    CSPIM

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


个人项目

  • 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)

    代码证明以演示如何加密二进制文件的一部分。修改后的二进制文件扩展了一个小函数,该函数在运行时解密文件的安全部分以使其执行。



  • ELFcrypt (2018)

    简单的 ELF 加密器。使用 RC4 加密。



历史的

  • 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





附加信息

用于混淆的自修改代码分类法(2011) 简要总结了其中一些工具并讨论了各种混淆技术。

参考

  1. 了解 Linux 恶意软件

  2. 现代 Linux 恶意软件暴露

  3. 拆箱 Linux/Mumblehard (2015) - ESET