首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将ELF文件的内容转储到特定的地址?

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

Stack Overflow用户
提问于 2020-11-09 23:21:46
回答 1查看 921关注 0票数 1

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

代码语言:javascript
复制
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个字节。我试着玩了“自己”和“objdump”,但是我没能得到我想要的。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-10 01:37:54

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

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

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

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

为了使这个问题更加具体,下面是一个例子:

代码语言:javascript
复制
// 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

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

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

让我们检查一下:

代码语言:javascript
复制
dd if=a.out bs=1 count=15 skip=$((0x002020)) 2>/dev/null
This is the son

QED。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64760653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档