0

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

有没有办法将 gdb 地址转换为转储中的内容?还是有更好的方法让我在 xxd 转储中获取地址?

4

1 回答 1

3

我试图在 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将出现0x1ca224xxd输出的偏移量处。

于 2015-09-15T02:11:21.993 回答