找到PLT存根

时间:2017-05-03 21:54:12

标签: linux x86-64 elf plt got

我正在使用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条目和地址的。

1 个答案:

答案 0 :(得分:1)

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

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