gdb - 如何将 ELF 文件的内容转储到特定地址?

标签 gdb elf objdump readelf

使用GDB,如果我加载一个ELF图像并给它一个地址,我可以让GDB转储该地址处的ELF文件的内容。例如:

p *((MYSTRUCT *)0x06f8f5b0)
$1 = {
  filename = 0x6f8f5e0 <bla> "this is a string", format = 0x6f8f640 <pvt> "This is another string!\n", lineNumber = 148, argumentCount = 0 '\000', printLevel = 1 '\001'}

这是有效的,因为 GDB 已经加载了 ELF 镜像并解析了它的重定位表,并且它也知道 MYSTRUCT 的布局。

如果没有 GDB,我如何做同样的事情?实际上我并不关心解析 MYSTRUCT。我只想在位置 0x06f8f5b0 转储 20 个字节。我尝试过使用 readelf 和 objdump,但无法得到我想要的。

Python 代码(例如使用 pyelftools)也是可以接受的。

最佳答案

I just want a dump of 20 bytes at location 0x06f8f5b0.

您的问题仅在位置相关(即 ET_EXEC)二进制文件的上下文中才有意义(任何其他二进制文件都可以在任意地址加载)。

对于位置相关的二进制文件,答案非常简单:

  • 迭代程序头,直到找到“覆盖”所需地址的头,
  • .p_vaddr.p_offset 计算文件中的偏移量
  • 使用lseekread读取感兴趣的字节。

为了使这一点更加具体,这里有一个示例:

// main.c
const char foo[] = "This is the song that never ends.";
int main() { printf("&foo = %p\n", &foo[0]); return 0; }

gcc -w -no-pie main.c

./a.out ; ./a.out
&foo = 0x402020
&foo = 0x402020

readelf -Wl a.out | grep LOAD

  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
  LOAD           0x000000 0x0000000000400000 0x0000000000400000 0x000438 0x000438 R   0x1000
  LOAD           0x001000 0x0000000000401000 0x0000000000401000 0x0001bd 0x0001bd R E 0x1000
  LOAD           0x002000 0x0000000000402000 0x0000000000402000 0x000190 0x000190 R   0x1000
  LOAD           0x002e10 0x0000000000403e10 0x0000000000403e10 0x000220 0x000228 RW  0x1000

在这里,我们看到我们关心的地址是第三个 LOAD 段中的 0x20 字节,该段从文件中的偏移 0x002000 开始。

因此,我们感兴趣的字节位于文件中的偏移 0x2020 处。

让我们检查一下:

dd if=a.out bs=1 count=15 skip=$((0x002020)) 2>/dev/null
This is the son

QED。

关于gdb - 如何将 ELF 文件的内容转储到特定地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64760653/

相关文章:

emacs - emacs下使用gdb时的缓冲区控制

linux - 签署(和验证)ELF 文件的规范方式?

linux - 如何将 elf 解释器 (ld-linux.so.2/ld-2.17.so) 构建为静态库?

c - 汇编指令 addl 使用 byte 而不是 long

assembly - 比较两个二进制文件

gdb - 如何用GDB调试交叉编译的QEMU程序?

c++ - 已修复 : C++ server/client program: "Connection refused"

无法在 malloc() 处设置断点

linux - .eh_frame 和 .eh_frame_hdr 部分究竟存储什么?

python - 以格式化版本打印程序的输出