静态解包二进制文件

逆向工程 混淆 开箱 可执行
2021-06-13 09:30:05

假设我有一个无法执行的二进制文件(例如,它在我没有的设备上运行),但我可以反汇编它。我可以获得有关架构的文档。(在我的例子中是 MIPS 小端。)但是二进制文件的导入很少,字符串也很少,等等,所以它看起来真的很紧凑。

我怎样才能静态地解压它?(编辑:我的意思是,在无法访问原始设备的情况下打开它。)

4个回答

在过去我见过的 30 多个嵌入式设备固件中,我很少看到它们使用任何专有的东西。通常它只是 gzip/LZMA 或他们使用的类似压缩(尽管有时带有修改或剥离的标头)。

因此,作为第一步,我会尝试使用binwalk 之类的方法来搜索已知的压缩算法。如果这没有帮助,请尝试查找加密常量的工具,例如Find CryptSign search这仅在加密是软件实现时才有效。如果它是一个更复杂的设备,比如机顶盒,带有硬件加速解密引擎和用于存储密钥的 OTP 内存,那么如果没有运行时访问,你就不走运了(除非它们极大地搞砸了从OTP 到解密引擎)。

最后,您可以尝试找出它们是否使用某些专有算法,并使用QEMUgxemul模拟该算法,或者用高级语言编写自己的解压缩器。

The Ida Pro Book 中,Chris Eagle 演示了一个名为ida-x86emu的插件的使用,该插件可用于通过模拟 IDA 数据库中的执行来静态解压二进制文件。看看这个; 它是开源的,而且很容易使用。

几种可能的方式:

  1. 识别包装工

    • 获取您平台的标准打包程序(例如UPX),检查它是否不是使用的打包程序
    • 如果它是标准的打包程序,那么您可能已经赢了,因为它可能被记录在案,或者甚至更好,例如 UPX,它可以自行解包并且是开源的。
  2. 识别算法

    • 没有那么多好的+广泛的打包算法(NRV、LZMA、JCAlg、ApLib、BriefLZ)。它们通常很容易通过它们的体型或常数来识别。(我在Kabopan 中用纯 python 实现了其中的几个
    • 如果您可以轻松识别打包/加密算法,那么您可能会找到静态解包的干净实现
  3. 弄脏你的手

    • 如果你仍然不知道算法并且它显然是一个自定义的,那么阅读同一平台的另一个打包程序(即再次阅读UPX Mips二进制文件及其源代码),这样它可以让你熟悉类似的(打包程序)在您的平台上使用的技巧。
    • 然后寻找可能的压缩算法(可能是一段看起来不同的代码,人们很少弄乱它们,用你喜欢的语言重新实现算法,并在外部解压(定位参数,应用算法,修改/重建二进制)
  4. 通过暴力破解的懒惰方法:像ApLib这样的一些算法没有任何头文件和参数(甚至没有大小):该算法只需要一个指向压缩缓冲区的指针,所以有时只是盲目地在二进制文件的任何偏移量上尝试就足够了,并检查我们是否得到了一个不错的解压缩缓冲区(不是太小,不是很大+充满 00)。

我的一般答案是“通过模拟针对打包二进制文件的自修改操作”。因此,例如,这将包括消除大多数封隔器所隐藏的压缩。这样做将需要“静态跟踪”通过加壳器的执行流程,其代码可能会进行自我修改。

该解释适用于传统的打包方式,其中二进制文件的部分仅被压缩/加密。可能需要更复杂的解包策略,例如我的论文“解包虚拟化混淆器” 1 中所述