【问题标题】:find address of PLT stub查找 PLT 存根的地址
【发布时间】:2017-05-03 21:54:11
【问题描述】:

我正在使用 Linux X86_64。

在给定条目所代表的动态函数的名称的情况下,我需要确定 ELF 文件中特定 PLT 条目的地址。 我可以从地址中找出文件偏移量,但我需要能够确定地址。

如果我使用 objdump -D -z elffile 反汇编 ELF 文件,我看到 objdump 为 PLT 中的每个条目使用符号名称。 (objdump从哪里获取这些地址和符号名的关系?)

示例:

0000000000000041a2b0 fileno@plt:

如果我使用objdump -T elffile | grep fileno,我会得到这样的结果:

0000000000000   DF *UND*  00000000000000000   GLIBC_2.2.5 fileno

我需要能够从“C”做的是在ELF文件中找到特定动态函数的PLT条目并获取地址。

背景是我正在修补现有的 ELF 文件,需要将函数调用重定向到不同的动态函数。我已经使用从 objdump 反汇编中收集的地址手动修补了 ELF 文件,并证明这将适用于我的特定应用程序,我只需要能够从程序中完成它。我希望不必爬过 objdump 反汇编代码来弄清楚它是如何获取 PLT 条目符号和地址的。

【问题讨论】:

  • 有趣的是,似乎没有办法从汇编中做到这一点。直觉上movq someFunc@PLT, %rax 应该这样做,但是@PLT 引用似乎暗示了链接器修改会弄乱movq,这似乎使得这些someFunc@PLT 引用只能与调用指令一起使用。

标签: linux x86-64 elf plt got


【解决方案1】:

我想通了: 您必须解析 rela.plt 部分中的重定位表。 这些条目包含一个字符串表索引,可用于通过索引到动态符号部分来查找函数名称。动态符号部分中的每个条目都包含一个动态字符串表偏移量,可用于提取函数名称。当您找到相应的函数时,重定位表中的索引 (+1) 对应于函数 PLT 条目的 .plt 部分的索引。因此,要计算特定条目的地址,只需:.plt.sec address + ((relocation_index + 1) * .plt entry size)

此方法适用于 x86。 它不适用于 .plt 部分具有完全不同格式的 PPC。如果有人有任何关于为 PPC 执行此操作的信息,请发布。

【讨论】:

  • 注意 i386,PLT 条目大小报告不正确。您可以将报告的 plt 条目大小乘以 4,或使用 16 作为条目大小。
猜你喜欢
  • 1970-01-01
  • 2014-08-27
  • 2014-09-06
  • 2012-07-02
  • 1970-01-01
  • 2017-02-24
  • 2011-11-07
  • 2020-10-29
  • 1970-01-01
相关资源
最近更新 更多