gdb与xxd转储中的地址

Addresses in gdb versus xxd dump

本文关键字:地址 转储 xxd gdb      更新时间:2023-10-16

我正试图在xxd转储中找到一行代码。如果我用gdb打开可执行文件,并在代码行添加断点,它会显示一个类似0x8212224的地址,但我的xxd转储仅高达0x304080。

有没有办法将gdb地址转换为转储中的地址?或者有更好的方法让我在xxd转储中获取地址吗?

我正试图在xxd转储中找到一行代码。

为什么?你真正想实现的是什么?

很有可能,使用GDB可以更容易地实现这一点。

如果我用gdb打开可执行文件,并在代码行添加断点,它会显示一个类似0x8212224的地址,但我的xxd转储仅高达0x304080。

您需要了解更多关于可执行文件的信息。

运行以下命令: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处的指令将出现在xxd输出的偏移0x1ca224处。