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

时间:2015-06-03 19:35:30

标签: 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>

例如,0x400410和函数名puts@plt等等。我试过阅读ELF二进制文件的REL_PLT部分。但是我得到了来自全局偏移表的PLT条目0x601108的地址0x400410。如何获取plt条目的虚拟地址?

编辑:结果发现我正在阅读got.plt部分。如何使用readelf阅读.plt部分?

1 个答案:

答案 0 :(得分:-1)

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