用户态进程:如何创建,如何销毁

如何创建 分为两个步骤: fork()/clone() 创建新内核线程 execve() 执行新用户态程序 新 forked 出来的线程如何开始工作 在 fork()/clone() 的过程中: 由 copy_process() 调用体系结构相关的 copy_thread() 来构造新线程的上下文; 由 wake_up_new_task() 将新线程的 task_struct 挂到某个 CPU 的 run queue 上,待调度器调度执行。 x86_64 1copy_thread(p, args) { 2 struct pt_regs *childregs = task_pt_regs(p); 3 struct fork_frame …

Linux 脚本执行:由一个补丁分析说起

事情背景 补丁链接:a4ae32c71fe9 (“exec: Always set cap_ambient in cap_bprm_set_creds”) 补丁信息中提到,该补丁是为了确保 cap_bprm_set_creds() 每次都会设置 cap_ambient 变量。另外还提到了下述内容: … if there is a suid or sgid script with an interpreter that has neither the suid nor the sgid bits set the interpreter should be able to accept …

Search Paths for Dynamic Linking & Loading

Before we start When talking about “dynamic linking”, people could refer to any of the following two processes: one is a step of program’s construction, where (relocatable) object files are dynamically linked by the linker – a toolchain’s component; the other is a pre-processing stage of …

ELF 调试器示例代码

这份调试器的示例代码来自《Learning Linux Binary Analysis》 书中第三章的“A simple ptrace-based debugger”一节,添加了一些调试打印和关于代码细节的注释。其他相关内容可查阅此书。 1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4#include <unistd.h> 5#include <fcntl.h> 6#include <errno.h> 7#include <signal.h> 8#include …