在elf二进制中,假设我知道二进制的偏移量。
在那种情况下,我怎么知道那个偏移区域的虚拟地址呢?
更详细地说,这里是二进制my_binary
的……我在二进制"the_key_string"
的偏移量中找到了数据0x204
。
在这种情况下,当它在内存中加载时0x204
被映射。问题:我从中获取地址信息
的最简单方法是什么?
你能推荐我任何有用的工具快捷方式(或..)
......或者我可以通过命令组合来做到这一点吗?0x0804204
0x0804204
0x204
010editor
hxd
objdump
1573 次
1 回答
2
ELF 程序有一个程序头,它列出了PT_LOAD
段(struct Elf32_Phdr
或struct Elf64_Phdr
)。它们既有文件偏移量和长度(p_offset
和p_filesz
成员),也有虚拟地址和长度(p_vaddr
和p_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
段覆盖,因此加载程序在运行时映射。如果数据在未分配的部分中,它就不会在内存中(除非您通过其他方式从磁盘读取它)。
但是如果数据被分配了,那么它将落入其中一个加载段,一旦有了基地址,就可以使用加载段中的信息从文件偏移量计算虚拟地址。
于 2019-02-25T22:18:57.383 回答