将 Linux 可执行文件从 32 位移植到 64 位

逆向工程 拆卸 重新组装
2021-06-28 06:52:52

正如您想象的那样,源代码不可用。可执行文件是使用 C/C++ 编写的,并使用gcc.

这就是file关于文件的内容

ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, not stripped

根据ldd,这些是程序使用的库:

    libssl.so.1.0.0 => /lib/i386-linux-gnu/libssl.so.1.0.0 (0xf7700000)
    libcrypto.so.1.0.0 => /lib/i386-linux-gnu/libcrypto.so.1.0.0 (0xf7554000)
    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7528000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf737e000)
    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf7363000)
    librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xf7359000)
    libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xf7270000)
    libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf726b000)
    libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xf7252000)
    /lib/ld-linux.so.2 (0xf7789000)
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf7234000)

所有这些库也有 64 位版本。

问题:

  1. 是否可以将应用程序重新组装为 64 位应用程序?
  2. 有什么工具可以帮助处理这样的事情?(如果可能的话)
2个回答

即使它不在问题中,因为实际重新组装会非常困难,我希望您可以尝试重新组装以外的其他东西,或者它至少是一个小且未混淆的文件。

低级

重新组装将非常困难:

工具:除了 IDA 和正常的逆向工程方法之外,我想不出一个特定的工具来提供帮助(我收到了类似的将 DOS/NE 文件移植到 PE 的请求)

调用约定:从 32b 移植到 64b 会很困难,因为调用约定不同,因此需要在汇编级别重写它们。至少,ELF 结构非常相似。

高水平

最好的办法是尝试通过Hex-Rays Decompiler进行反编译以节省麻烦,但在反编译后的代码可以按预期工作之前,它仍然需要大量繁琐的工作。

这里的问题是你需要什么?您是否需要能够在 64 位上运行这个东西并与之交互,或者目标是实际移植它

运行

如果您只需要运行它并且我们可以假设兼容性库(允许在 64 位上运行 32 位程序的那些库)作为给定,您可能可以使用标准ld.so方法(LD_PRELOAD和朋友拦截各种功能,如在回答中概述的如何向现有的二进制可执行文件添加功能? 从那里开始,您将能够通过内存映射文件或套接字或您认为适合此目的的任何类型的 IPC 机制与现有的和未更改的 32 位程序进行交互。

坦率地说,这可能是投入最少的最佳方法。

在 Debian 5 上,兼容层位于以下两个包中:

libc6-dev-i386 - Embedded GNU C Library: 32-bit development libraries for AMD64
libc6-i386 - Embedded GNU C Library: 32-bit shared libraries for AMD64

在 Ubuntu 10.04 到 12.04 上使用相同的名称。这些是我目前可以检查的唯一版本,但我知道 RHEL/CentOS/ScientificLinux 中有类似的东西。

移植它

否则,您会遇到大量问题,其中最大的问题已由ange albertini 在这里概述

一般来说,如果幸运的话,看起来像这样,调试信息(not stripped它说的)将允许您整理源文件的名称,因此您可以将诸如库之类的拼图放在一起,然后可以专注于“实际”代码。这可能不是一个很大的优势,但对于逆向工程师来说,每一根小稻草都有帮助。

像 Hex-Rays 插件或 Hopper 附带的反编译器可能是获得更高级代码概念的好方法。除非你专注于你需要的功能部分,否则这将是很多工作 - 这就是为什么我(懒惰和所有人)总是使用上面的选项,即在兼容模式下运行它。