假设二进制文件是PIC,如何将其加载到内存并执行入口点?
我这样做是为了熟悉 ELF 所以execve
不允许。
这些是基本步骤:
- 阅读程序头以查找 LOAD 指令并确定您需要的映射的总长度(以页为单位)。
- 将最低地址的 LOAD 指令映射到总长度(可能大于文件长度),让
mmap
给你分配一个地址。这将保留连续的虚拟地址空间。
- 使用以下命令将剩余的 LOAD 指令映射到此映射的各个部分之上
MAP_FIXED
.
- 使用程序头来查找
DYNAMIC
向量,这将为您提供重定位向量的地址。
- 应用搬迁。假设您的二进制文件是静态链接的 PIE 二进制文件,它们应该完全包含
RELATIVE
重定位(只需添加基本加载地址),这意味着您不必执行任何符号查找或任何花哨的操作。
-
构造一个 ELF 程序入口堆栈,由堆栈上的数组中的以下系统字大小的值序列组成:
ARGC ARGV[0] ARGV[1] ... ARGV[ARGC-1] 0 ENVIRON[0] ENVIRON[1] ... ENVIRON[N] 0 0
(这一步需要ASM!)将堆栈指针指向该数组的开头并跳转到加载程序的入口点地址(可以在程序头中找到)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)