[pwn基础]Linux内核装载ELF过程简介
2022-06-11 12:12
3759 查看
[toc]
[pwn基础]Linux内核装载ELF过程简介
用户层:
用户层bash进程会调用
fork系统调用创建一个新的进程,然后新的进程调用
execve()系统调用执行指定的
ELF文件,原先的bash进程继续返回等待刚才启动的新进程结束,然后继续等待用户输入命令。
扩展学习:https://blog.csdn.net/qq_41453285/article/details/89006116
int execve(const char *filename,char *const argv[], char *const envp[]); //filename = 被执行的程序文件名 //argv[] = 执行的参数 //envp[] = 环境变量
利用fork()、execlp()实现minibash:
#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main() { char buf[1024]={0}; pid_t pid; while(1) { printf("minibash$"); scanf("%s",buf); pid = fork(); if(pid == 0)//子进程 { if(execlp(buf,0) < 0){ printf("exec error\n"); } }else if(pid > 0)//父进程 { int status; waitpid(pid,&status,0);//等待子进程返回 printf("子进程执行完毕!\n"); }else{ //返回-1 创建进程失败! printf("创建进程失败!\n"); } } return 0; }
## 内核层
在用户层调用
execve函数后,进入到内核层,Linux内核开始进行真正的装载工作。
execve() 系统调用相应的入口是sys_execve(),在源码
arch\i386\kernel\Process.c中被定义。
最终sys_execve会调用
do_execve()函数,do_execve函数会首先查找被执行的文件,如果找到文件,读取文件的前
128字节,用来判断文件
Magic(魔数)。
确定是ELF文件后,最后会调用
load_elf_binary()函数来进行ELF文件的装载,该文件被定义在
fs\Binfmt_elf.c中。(函数的主要实现步骤):
(1) 检查ELF可执行文件格式的有效性,比如Magic(魔数)、程序头表(段表)的数量。 (2) 寻找动态链接的 ".interp"段,设置动态链接器的路径。 (3) 根据ELF可执行文件的程序头表(段表),对ELF文件进行映射,代码段、数据段、只读数据段。 (4) 初始化ELF进程环境,比如进程启动时EDX寄存器的地址应该是"DT_FINI"地址。 (5) 将系统调用的返回地址修改成"ELF可执行文件入口点",(如果是静态链接,那么入口点是"e_entry"),(如果是动态链接,那么入口点是"动态链接器") (6) laod_elf_binary() ret -> do_execve() ret -> sys_execve() ret[返回已被修改] -> eip =(ELF入口) 开始执行ELF程序,装载完毕,进程执行。
相关文章推荐
- 【linux内核装载elf过程简介】
- Linux操作系统分析(3)- 内核装载ELF的过程总结
- Linux操作系统分析(3)- 内核装载ELF的过程总结
- Linux操作系统分析(3)- 内核装载ELF的过程总结
- 打造自己的专属linux(四):Linux内核编译过程简介
- Linux计算机进程地址空间与内核装载ELF
- 通过gdb跟踪Linux内核装载和启动可执行程序过程
- 浅析Linux计算机进程地址空间与内核装载ELF
- 浅析Linux计算机进程地址空间与内核装载ELF
- 浅析Linux计算机进程地址空间与内核装载ELF
- Linux计算机进程地址空间与内核装载ELF
- linux基础-(linux 系统运行过程简介)
- linux内核装载elf过程简介
- 通过gdb跟踪Linux内核装载和启动可执行程序过程
- Linux内核中ELF可执行文件的装载/load_elf_binary()函数解析
- 打造自己的专属linux(四):Linux内核编译过程简介
- 浅析Linux计算机进程地址空间与内核装载ELF
- Linux入职基础-4.9_系统启动过程(2):内核的引导程序
- Linux入职基础-4.10_系统启动过程(3):Linux内核(vmlinuz)启动
- 操作系统开发系列—12.c.从Loader加载ELF内核,顺便解释下函数调用过程 ●