当我拥有GOT_OFFSET_TABLE时如何获取.plt地址?

问题描述 投票:0回答:2

[当我测试从过程映像重构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

reverse-engineering elf bin
2个回答
0
投票

好像我们在读同一本书“学习Linux二进制分析”,并且坚持相同的练习。我没有找到一种优雅的方法来检索.plt地址,但是您可以通过使用ElfN_Shdr.sh_name并对其进行strcmp(ElfN_Shdr.sh_name, '.plt')来找到它。


0
投票

所以我设法用PIE(独立于进程的执行)编译后的二进制文件到达.plt地址。我观察到.plt节始终位于.text节的顶部。

© www.soinside.com 2019 - 2024. All rights reserved.