【问题标题】:In elf binary, Is there any simple method to get memory address from offset?在精灵二进制中,有没有简单的方法从偏移量获取内存地址?
【发布时间】:2019-07-18 21:50:59
【问题描述】:

在elf二进制中,假设我知道二进制的偏移量。
在那种情况下,我怎么知道那个偏移区域的虚拟地址呢?
更详细地说,这里是二进制my_binary
...我在二进制 0x204 的偏移量中找到了数据 "the_key_string"
在这种情况下,0x204 在内存中加载时会映射到 0x0804204

问题:
什么是最简单的方法我从0x204 获得地址信息0x0804204
您能否向我推荐任何有用的工具快捷方式(010editorhxd..)
...或者我可以结合使用objdump 命令吗?

【问题讨论】:

  • 我相信每次运行时这些地址都是随机的
  • @BlackBear 不,它是二进制中的固定值。

标签: linux binary hex elf


【解决方案1】:

ELF 程序有一个程序头,其中列出了PT_LOAD 段(struct Elf32_Phdrstruct Elf64_Phdr)。它们具有文件偏移量和长度(p_offsetp_filesz 成员)以及虚拟地址和长度(p_vaddrp_memsz)。关键是由文件偏移量和长度标识的区域在运行时在指定的虚拟地址处变为可用。虚拟地址是相对于内存中对象的基地址的。

您可以使用readelf -l查看程序头:

Elf file type is DYN (Shared object file)
Entry point 0x1670
There are 9 program headers, starting at offset 64

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           0x0000000000000040 0x0000000000000040 0x0000000000000040
                 0x00000000000001f8 0x00000000000001f8  R E    0x8
  INTERP         0x0000000000000238 0x0000000000000238 0x0000000000000238
                 0x000000000000001c 0x000000000000001c  R      0x1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
  LOAD           0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x000000000000627c 0x000000000000627c  R E    0x200000
  LOAD           0x0000000000006d68 0x0000000000206d68 0x0000000000206d68
                 0x00000000000004b8 0x0000000000000658  RW     0x200000
…

在这种情况下,有两个加载段,一个可读可执行(程序代码),一个可读可写(数据和重定位)。

并非二进制文件的所有部分都被PT_LOAD 段覆盖,因此加载程序在运行时映射。如果数据在未分配的部分中,它就不会在内存中(除非您通过其他方式从磁盘读取它)。

但是如果数据被分配了,那么它将落入其中一个加载段,一旦有了基地址,就可以使用加载段中的信息从文件偏移量计算虚拟地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 2019-07-01
    • 2013-08-28
    相关资源
    最近更新 更多