假设二进制文件是PIC,我如何将它加载到内存中并执行入口点?
我这样做是为了熟悉 ELF,所以 execve
是不允许的。
最佳答案
这些是基本步骤:
- 阅读程序头以找到 LOAD 指令并确定您需要的映射的总长度(以页为单位)。
- 将最低地址的 LOAD 指令映射到总长度(可能大于文件长度),让
mmap
为您分配一个地址。这将保留连续的虚拟地址空间。 - 使用
MAP_FIXED
将重新挖掘的 LOAD 指令映射到此映射的部分之上。 - 使用程序头找到
DYNAMIC
vector ,它将依次为您提供重定位 vector 的地址。 - 应用搬迁。假设您的二进制文件是静态链接的 PIE 二进制文件,它们应该完全由
RELATIVE
重定位组成(仅添加基本加载地址),这意味着您不必执行任何符号查找或任何花哨的操作。 构造一个 ELF 程序入口堆栈,该堆栈由堆栈中数组中的以下系统字大小值序列组成:
ARGC ARGV[0] ARGV[1] ... ARGV[ARGC-1] 0 ENVIRON[0] ENVIRON[1] ... ENVIRON[N] 0 0
(此步骤需要ASM!)将堆栈指针指向此数组的开头,并跳转到加载程序的入口点地址(可在程序头中找到)。
关于c - 如何手动加载和执行 ELF 二进制可执行文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6554825/