和《[kernel] 带着问题看源码 —— 进程 ID 是如何分配的》一样,这里使用bootlin查看内核 3.10.0 版本源码,脚本文件是在 execve 时解析的,所以先搜索 sys_ execve: 整个调用链如下: sys_execve -> do_execve -> do_execve_common -> search_binary_handler-> load_binary -> load_script (binfmt_script....
调用initrd_load()进行早期根文件系统的挂载,如果mount_initrd为true的情况下(就是bootargs如果不传入noinitrd的话,说明要用initrd),将执行handle_initrd()挂载根文件系统 调用mount_root()函数进行挂载根文件系统。该种方式是linux内核中比较常用的方式,在这种方式下,又包含三种文件系统挂载操作:1、nfs方式。2、cifs...
如果当前程序被跟踪了(ptraced),那么,当成功执行execve后,会产生一个SIGTRAP信号。 在执行成功的情况下,execve函数不返回,执行失败返回-1,errno被设置。 执行成功后,调用进程的text,data,bss和stack段被调用execve运行的程序覆盖。 6)ptrace——进程跟踪 #include <sys/ptrace.h> long ptrace(enum __ptrace_reques...
init进程在内核态下面时,通过一个函数 kernel_execve 来执行一个用户空间编译连接的应用程序就跳跃到用户态了。这个过程是不可逆的。转化过程中进程号是没有改变的,所以一直是进程1,一旦执行了init程序转到用户态下,整个操作系统就真正的运转起来,以后只能在用户态下工作了。 init进程是其他用户进程的祖宗。linux系统...
(1)读取CP15协处理器中的c0寄存器中的CPU ID ,然后调用这个函数来做合法性的检验,如果合法则继续启动,如果不合法则停止启动,转向__error_p启动失败。 (2)这个函数检验CPU id合法的方法是:内核会实现维护一个本内核支持的cpu id数组,这个函数做的任务就是,将从硬件读取到的cpu id号码和内核中维护的那一份cpu...
bprm_execve() exec_binprm() search_binary_handler() __request_module() // wrapped as request_module call_modprobe() 1. 2. 3. 4. 5. 6. 7. 8. 9. 其中call_modprobe()定义于kernel/kmod.c,我们主要关注这部分代码: static int call_modprobe(char *module_name, int wait) ...
GUI Shell,它的功能是以图形化的方式管理所有的应用入口(并内置了一些应用程序比如文件管理、设置之类的),并负责将用户的一些交互行为转换为控制命令。 比如用户点击APP图标,打开APP,本质上是GUI Shell帮忙调用了系统调用:fork()创建进程 →execve()执行指定的可执行文件等...
当内核执行一个错误的文件或未知文件类型的时候,就会调用modprob_path所指向的程序,如果我们修改他所指向的程序为我们自己写的一个sh文件,并利用system或execve函数去执行一个位置类型的文件,那么在发生错误的时候就会以root权限执行我们自己写的sh文件中的内容。 我们可以在自己的exp中通过system函数创建一个sh文件将ro...
3. 最后使用execve触发modprobe,利用modprobe_path覆写技术,成功赋予/bin/bash suid权限: 脚本成功利用后可使用bash -p获得root权限。 要想使利用代码适用不同的内核版本,还需调整代码中single_start和modprobe_path的偏移量。 kctf版本代码可实现在GKE环境中完成容器逃逸,但是并不是100%可以成功,利用代码主要依赖FUSE...
fork, clone, vfork用于进程的创建,exit用于进程的退出,setrlimit用于设置对进程的资源限制,nice用于调整进程的优先级,execve装载一个新进程,此外还有大量用于查询进程属性的系统调用。 内存管理 brk用于malloc内存分配,mmap、munmap用于映射和解除映射,swapon用于开启交换区。