将静态链接的 elf 二进制文件转换为动态链接的

2024-04-29

我有一个 elf 二进制文件,它已静态链接到 libc。 我无权访问其 C 代码。 我想使用 OpenOnload 库,它在用户空间中实现了套接字,因此与标准 libc 版本相比提供了更低的延迟。 OpenOnload 实现标准套接字 api,并使用 LD_PRELOAD 覆盖 libc 版本。 但是,由于此 elf 二进制文件是静态链接的,因此它无法使用 OpenOnload 版本的套接字 API。

我相信可以通过以下步骤将此二进制文件转换为与 OpenOnload 动态链接:

  1. 添加新的程序头:PT_INTERP、PT_DYNAMIC 和 PT_LOAD。
  2. 在 PT_DYNAMIC 中添加条目以列出与 libc 的依赖关系。
  3. 在新的 PT_LOAD 部分中添加所需 libc 函数的 PLT 存根。
  4. 修改 libc 函数的现有二进制代码以跳转到相应的 PLT 存根。

作为第一次剪辑,我尝试只添加 3 个 PT_LOAD 段。新的段标头添加到现有的 PT_LOAD 段标头之后。此外,现有段的 vm_addr 未修改。现有段的文件偏移量根据 p_align 向下移动到下一个对齐地址。 新的 PT_LOAD 段已添加到文件末尾。

重写该文件后,当我运行它时,它被内核正确加载,但随后立即出现段错误。

我的问题是:

  1. 如果我只是移动 elf 二进制文件中的文件偏移量,而不修改 vm_addresses,那么在运行二进制文件时会导致任何错误吗?
  2. 可以做我正在尝试的事情吗?有人尝试过吗?

您所尝试的操作不可能以任何自动化方式实现。在静态链接时,所有将对 libc 的调用标识为对 libc 的调用的重定位信息已被解析并删除。如果二进制文件中存在调试符号,则可以识别“文本段中的该字节范围对应于某某libc函数”,但无法识别参考到函数,它将嵌入指令字节流中,没有标记来识别它们。您可以使用基于反汇编的启发式方法,但它们是不完整且不可靠的(可能出现误报和误报)。

就移位偏移而言,您绝对不能更改静态链接二进制文件的加载地址的任何内容。如果需要在加载段之前插入标头,则必须插入整个页面,并更新程序标头表中的文件偏移量(向其中添加 1 页),同时保持虚拟地址加载偏移量相同。然而,由于您想要做的事情总体上是不可能的,因此偏移转移问题是您最不需要担心的问题。

也许,如果程序不需要高性能,您可以在 qemu 应用程序级模拟下运行它,其中 qemu 通过套接字模拟/包装器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将静态链接的 elf 二进制文件转换为动态链接的 的相关文章

随机推荐