阅读ELF二进制和打印功能虚拟地址的plt部分

use*_*ser 6 c executable elf readelf

我想读取ELF二进制文件的.plt部分并获取外部函数的所有虚拟地址.

Disassembly of section .plt:

0000000000400400 <puts@plt-0x10>:
  400400:       ff 35 02 0c 20 00       pushq  0x200c02(%rip)        # 601008 <_GLOBAL_OFFSET_TABLE_+0x8>
  400406:       ff 25 04 0c 20 00       jmpq   *0x200c04(%rip)        # 601010 <_GLOBAL_OFFSET_TABLE_+0x10>
  40040c:       0f 1f 40 00             nopl   0x0(%rax)

0000000000400410 <puts@plt>:
  400410:       ff 25 02 0c 20 00       jmpq   *0x200c02(%rip)        # 601018 <_GLOBAL_OFFSET_TABLE_+0x18>
  400416:       68 00 00 00 00          pushq  $0x0
  40041b:       e9 e0 ff ff ff          jmpq   400400 <_init+0x20>

0000000000400420 <__libc_start_main@plt>:
  400420:       ff 25 fa 0b 20 00       jmpq   *0x200bfa(%rip)        # 601020 <_GLOBAL_OFFSET_TABLE_+0x20>
  400426:       68 01 00 00 00          pushq  $0x1
  40042b:       e9 d0 ff ff ff          jmpq   400400 <_init+0x20>

0000000000400430 <__gmon_start__@plt>:
  400430:       ff 25 f2 0b 20 00       jmpq   *0x200bf2(%rip)        # 601028 <_GLOBAL_OFFSET_TABLE_+0x28>
  400436:       68 02 00 00 00          pushq  $0x2
  40043b:       e9 c0 ff ff ff          jmpq   400400 <_init+0x20>
Run Code Online (Sandbox Code Playgroud)

例如,0x400410和函数名称puts@plt等.我试过阅读REL_PLTELF二进制文章.但是我得到了来自Global Offset Table的0x601108PLT条目的地址0x400410.如何获取plt条目的虚拟地址?

编辑:原来我正在阅读got.plt部分.如何.plt使用readelf 读取部分?

DrP*_*tay -1

嗯,如果我正确理解了你的问题,那么你就不能...... ASLR - 地址空间布局随机化,每个 SO 都会被加载到某个随机地址中,并且在加载时或运行时(取决于符号的绑定 - 是否惰性)GOT 更改为加载的外部符号的实际虚拟地址,当调用某些外部函数时,您基本上是跳转到某个预定义的偏移量(进入 GOT)并从该地址调用该函数将存储在该偏移量内。ld 或操作系统加载程序的目标是将该地址更改为您应该在运行时跳转到的地址