如何手动加载和执行ELF二进制可执行文件?

时间:2011-07-02 02:51:09

标签: c elf

假设二进制文件是PIC,如何将其加载到内存中并执行入口点? 我这样做是为了熟悉ELF,因此不允许使用execve

1 个答案:

答案 0 :(得分:6)

这些是基本步骤:

  1. 阅读程序标题以查找LOAD指令并确定页面中所需的映射总长度。
  2. 使用总长度(可能大于文件长度)映射最低地址LOAD指令,让mmap为您指定一个地址。这将保留连续的虚拟地址空间。
  3. 使用MAP_FIXED将提醒LOAD指令映射到此映射的部分顶部。
  4. 使用程序标题查找DYNAMIC向量,该向量将为您提供重定位向量的地址。
  5. 应用重定位。假设你的二进制文件是一个静态链接的PIE二进制文件,它们应该完全由RELATIVE重定位组成(只需添加基本加载地址),这意味着你不必执行任何符号查找或任何花哨的东西。
  6. 构造一个ELF程序入口堆栈,该堆栈由堆栈中数组中的以下系统字大小值序列组成:

    ARGC ARGV[0] ARGV[1] ... ARGV[ARGC-1] 0 ENVIRON[0] ENVIRON[1] ... ENVIRON[N] 0 0
    
  7. (此步骤需要ASM!)将堆栈指针指向此数组的开头并跳转到加载程序的入口点地址(可在程序头中找到)。

相关问题