[当我测试从过程映像重构elf可执行文件时,我得到了.dynamic和GOT_OFFSET_TABLE
,但是全局偏移量表已用相应共享库函数的解析值填充。我必须将这些地址替换为原始的PLT
存根地址。因此,如何从过程映像中获取PLT
存根地址。
for(c=0;dyn[c].d_tag !=DT_NULL ;c++){
switch (dyn[c].d_tag){
case DT_PLTGOT:
got = (Elf64_Addr)dyn[c].d_un.d_ptr;
printf("[+]Located plt.got vaddr:0x%x\n",got);
printf("[+]Relevant GOT entries begin at 0x%x\n", (Elf64_Addr)dyn[c].d_un.d_ptr + 24);
got_off = dyn[c].d_un.d_ptr - h.data_vaddr;
GOT_TABLE = (Elf64_Addr*)&pmem[h.data_offset +got_off];
GOT_TABLE += 3;
break;
...
}
Elf64_Addr PLT_VADDR = ?
gdb-peda$ x/10gx 0x601000 + 3*8
0x601018: 0x00007f3eaf557800 0x00007f3eaf522740 0x601018->GOT_OFFSET_TABLE[3]
0x601028: 0x00007f3eaf578160 0x0000000000000000
0x601038: 0x0000000000000000 0x0000000000000000
0x601048: 0x0000000000000000 0x0000000000000000
0x601058: 0x0000000000000000 0x0000000000000000
好像我们在读同一本书“学习Linux二进制分析”,并且坚持相同的练习。我没有找到一种优雅的方法来检索.plt
地址,但是您可以通过使用ElfN_Shdr.sh_name
并对其进行strcmp(ElfN_Shdr.sh_name, '.plt')
来找到它。
所以我设法用PIE(独立于进程的执行)编译后的二进制文件到达.plt
地址。我观察到.plt节始终位于.text节的顶部。