微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

使用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)也是可以接受的。

解决方法

我只想在位置0x06f8f5b0处转储20个字节。

您的问题仅在位置相关(即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

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

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

让我们检查一下:

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

QED。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。