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

Je *_*Rog 8 c elf

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

R..*_*R.. 7

这些是基本步骤:

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

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