我试图在 xxd 转储中找到一行代码。如果我用 gdb 打开可执行文件并在代码行添加断点,它会显示类似 0x8212224 的地址,但我的 xxd 转储仅高达 0x3040080。
有没有办法将 gdb 地址转换为转储中的内容?还是有更好的方法让我在 xxd 转储中获取地址?
我试图在 xxd 转储中找到一行代码。
做什么的?你真正想要达到什么目的?
很有可能,您可以使用 GDB 更轻松地实现这一目标。
如果我用 gdb 打开可执行文件并在代码行添加断点,它会显示类似 0x8212224 的地址,但我的 xxd 转储仅高达 0x3040080。
您需要更多地了解您的可执行文件。
运行这个命令:readelf -l your_exe
. 这将告诉您可执行文件中有多个LOAD
段,并告诉您这些段在文件中的哪个偏移量开始,这些段应该出现在内存中的哪个虚拟地址,它们有多大,以及它们应该有什么保护。
例如:
$ readelf -l a.out
Elf file type is EXEC (Executable file)
Entry point 0x80482f0
There are 9 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0x08048034 0x08048034 0x00120 0x00120 R E 0x4
INTERP 0x000154 0x08048154 0x08048154 0x00013 0x00013 R 0x1
[Requesting program interpreter: /lib/ld-linux.so.2]
LOAD 0x000000 0x08048000 0x08048000 0x0056c 0x0056c R E 0x1000
LOAD 0x000f08 0x08049f08 0x08049f08 0x00114 0x00118 RW 0x1000
DYNAMIC 0x000f14 0x08049f14 0x08049f14 0x000e8 0x000e8 RW 0x4
NOTE 0x000168 0x08048168 0x08048168 0x00044 0x00044 R 0x4
GNU_EH_FRAME 0x000490 0x08048490 0x08048490 0x0002c 0x0002c R 0x4
GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW 0x10
GNU_RELRO 0x000f08 0x08049f08 0x08049f08 0x000f8 0x000f8 R 0x1
这告诉您程序可执行文本(LOAD
第一段)出现在内存中的 address 处0x08048000
和文件中的 offset 处0
。也就是说,xxd 将在文件偏移处显示的指令将出现在内存0x124
中的地址处。0x08048124
假设您的可执行文件也链接到默认地址的加载0x08048000
,则内存中的指令0x8212224
将出现0x1ca224
在xxd
输出的偏移量处。