11

我有一个静态链接到 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 段。

重新编写文件后,当我运行它时,它被内核正确加载,但随后立即出现 seg-faulted。

我的问题是:

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

2 回答 2

5

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

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

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

于 2012-12-20T18:59:18.990 回答
0

OpenOnload ... 使用 LD_PRELOAD 覆盖 libc 版本。但是,由于这个精灵二进制文件是静态链接的......

还回答了拦截静态链接可执行文件的系统调用

于 2021-10-13T05:44:42.340 回答