gdb 与 xxd 转储中的地址
Addresses in gdb versus xxd dump
我试图在 xxd 转储中找到一行代码。如果我用 gdb 打开可执行文件并在代码行添加断点,它会显示类似 0x8212224 的地址,但我的 xxd 转储仅高达 0x3040080。
有没有办法将 gdb 地址转换为转储中的内容?或者有没有更好的方法让我在 xxd 转储中获取地址?
I'm trying to find a line of code in an xxd dump.
为了什么?您真正想要实现的目标是什么?
很有可能,您可以使用 GDB 更轻松地实现这一目标。
If I open the executable with gdb and add a breakpoint at the line of code, it shows an address like 0x8212224, but my xxd dump only goes as high as 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
段)出现在内存中的地址 0x08048000
和文件中的偏移量 0
处。也就是说,xxd 将显示在文件偏移 0x124
处的指令将出现在内存中的地址 0x08048124
处。
假设您的可执行文件也链接到加载默认地址0x08048000
,内存中0x8212224
处的指令将出现在偏移量[=20处=] 在 xxd
输出中。
我试图在 xxd 转储中找到一行代码。如果我用 gdb 打开可执行文件并在代码行添加断点,它会显示类似 0x8212224 的地址,但我的 xxd 转储仅高达 0x3040080。
有没有办法将 gdb 地址转换为转储中的内容?或者有没有更好的方法让我在 xxd 转储中获取地址?
I'm trying to find a line of code in an xxd dump.
为了什么?您真正想要实现的目标是什么?
很有可能,您可以使用 GDB 更轻松地实现这一目标。
If I open the executable with gdb and add a breakpoint at the line of code, it shows an address like 0x8212224, but my xxd dump only goes as high as 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
段)出现在内存中的地址 0x08048000
和文件中的偏移量 0
处。也就是说,xxd 将显示在文件偏移 0x124
处的指令将出现在内存中的地址 0x08048124
处。
假设您的可执行文件也链接到加载默认地址0x08048000
,内存中0x8212224
处的指令将出现在偏移量[=20处=] 在 xxd
输出中。