6

我想读取 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等等。我试图阅读REL_PLTELF 二进制文件的部分。但是我从全局偏移表中获得了0x601108PLT 条目的地址。0x400410如何获取 plt 条目的虚拟地址?

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

4

1 回答 1

-1

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

于 2017-01-14T23:08:55.347 回答