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

标签 c elf

假设二进制文件是PIC,我如何将它加载到内存中并执行入口点? 我这样做是为了熟悉 ELF,所以 execve 是不允许的。

最佳答案

这些是基本步骤:

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

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

关于c - 如何手动加载和执行 ELF 二进制可执行文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6554825/

相关文章:

java - 使用小数据类型是否会减少内存使用(来自内存分配而不是效率)?

c - 用指针反转 C 中的字符串文字

linux - 如何获取ELF文件的A值?

binary - ELF对象中的多个字符串表

c - ELF Parser 分离程序数据

C - 使用数组实现的堆栈中的大多数成员

c - 如何解决 "undefined reference to function"错误?

c - Lua shutdown/End 程序执行回调

c++ - 用于捕获 C++ group/dynsym 部分的 GNU LD 脚本

c++ - Linux elf .text方向