【发布时间】:2019-06-10 18:28:11
【问题描述】:
我一直在查看一些 ELF 二进制文件的反汇编,我注意到了这一点:
0000000000401020 <_start>:
401020: 31 ed xor ebp,ebp
401022: 49 89 d1 mov r9,rdx
401025: 5e pop rsi
401026: 48 89 e2 mov rdx,rsp
401029: 48 83 e4 f0 and rsp,0xfffffffffffffff0
40102d: 50 push rax
40102e: 54 push rsp
40102f: 49 c7 c0 30 13 40 00 mov r8,0x401330
401036: 48 c7 c1 d0 12 40 00 mov rcx,0x4012d0
40103d: 48 c7 c7 72 12 40 00 mov rdi,0x401272
401044: ff 15 a6 2f 00 00 call QWORD PTR [rip+0x2fa6] # 403ff0 <__libc_start_main@GLIBC_2.2.5>
40104a: f4 hlt
40104b: 0f 1f 44 00 00 nop DWORD PTR [rax+rax*1+0x0]
当__libc_start_main 被调用时,我们将这三个立即值作为参数通过寄存器传递。这些显然是在__libc_start_main(包括main)中调用的函数指针。但这些是虚拟地址,我的理解是二进制文件在加载到内存并运行时的实际映射地址不一定相同。因此,这些函数指针可能无法反映它们在内存中的实际位置。
由于更熟悉 PE 文件,IMAGE_DIRECTORY_BASERELOC 部分为我们提供了IMAGE_BASE_RELOCATION 结构,可帮助我们调整这些常量值以反映新的图像库。但是对于 ELF 文件,我看不到任何等效项。我在这里错过了什么吗?加载 ELF 文件时如何修复这些地址?
【问题讨论】:
标签: x86 elf portable-executable relocation