【问题标题】:ELF binary from memory内存中的 ELF 二进制文件
【发布时间】:2014-09-15 16:07:41
【问题描述】:

我刚刚用 C 语言编写了一个 Hello world 程序,我正在玩。我想尝试从内存中转储二进制文件(使用 gdb)并尝试从中创建另一个可执行文件。我尝试转储具有可执行权限的页面,然后转储其数据页;但是它有段错误。有什么方法可以做到这一点?有什么方法可以调试并找出它崩溃的原因吗?有什么通用的建议吗?

谢谢。

[编辑]

它在 linux 上,我在 32 位和 64 位 x86 上都试过了。内核版本为 3.13。我在 _start 上设置了一个断点,将可执行页面及其数据页面转储到一个文件中并尝试执行它。

【问题讨论】:

  • 您到底尝试了什么?这是在什么平台上的?我猜测它是 Linux ......什么版本的内核?什么架构?这是一个非常、非常、非常依赖于操作系统和架构的问题。
  • @DanLenski 我已经进行了回复,谢谢。

标签: c elf file-format


【解决方案1】:

等等,你只是将映射的文本(可执行页面)部分和映射的数据部分转储到文件中吗?它本身不是有效的 ELF 对象,ELF 文件也需要 ELF 头。我很惊讶操作系统甚至允许您尝试执行该操作,您应该收到有关无效 ELF 标头或类似内容的错误。

除了标题之外,ELF 文件还包含许多对运行它很重要的部分。

至于调试,我会从 GDB 开始,看看它在哪里崩溃。尝试加载程序时,您的程序是否崩溃,或者动态链接器是否崩溃?如果动态链接器崩溃,请尝试调试它,例如与

gdb --args /lib64/ld-2.18.so <your program>

以前曾尝试从内存中重新创建 ELF 文件 - 请查看 Statifier,它甚至将所有已加载的动态库静态包含到生成的 ELF 中。

【讨论】:

    【解决方案2】:

    这可能不是很简单,而且肯定是特定于处理器和操作系统的。

    您可以查看emacsunexec.c,它正在做您想做的事情。见this answer

    【讨论】:

      猜你喜欢
      • 2020-07-31
      • 2017-11-16
      • 1970-01-01
      • 2017-10-11
      • 2016-11-07
      • 2013-03-20
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      相关资源
      最近更新 更多