gpt4 book ai didi

linux - 在 elf 二进制文件中,有什么简单的方法可以从偏移量中获取内存地址吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:35 31 4
gpt4 key购买 nike

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

问题:
我从 0x204 获取地址信息 0x0804204最简单的方法是什么?
你能给我推荐工具中任何有用的快捷方式吗(010editorhxd..)
...或者我可以结合使用 objdump 命令来做到这一点吗?

最佳答案

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 段覆盖,因此在运行时由加载程序映射。如果数据在未分配的部分中,它就不会在内存中(除非您通过其他方式从磁盘读取它)。

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

关于linux - 在 elf 二进制文件中,有什么简单的方法可以从偏移量中获取内存地址吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54867108/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com