通过 ptrace 实现单步调试的方式有两种。 1. 父进程执行 fork 创建一个子进程,通过 ptrace 设置子进程为 PF_PTRACED 标记,然后执行 execve 加载被调试的程序。...execve(argv[1], NULL, NULL);} 执行 fork 创建子进程后,通过 ptrace 的 PTRACE_TRACEME 指示操作系统设置子进程为被调试(设置 PF_PTRACED...可以通过 register_binfmt 函数注册节点。那么谁调用了这个函数呢?...2 跟踪系统调用 ptrace 处理追踪进程执行过程之外,还可以实现跟踪系统调用。具体是通过 PTRACE_SYSCALL 命令实现。...下面是一个追踪进程所有系统调用的例子。
如果您正在考虑使用复杂的内核编程来完成任务, PTRACE_TRACEME 请三思。Linux 提供了一种优雅的机制来实现所有这些功能: ptrace (进程跟踪)系统调用。.../寄存器中的使用情况 主要应用于打断点(也是gdb的主要功能)和打印系统调用轨迹。...PTRACE_TRACEME 本进程被其父进程所跟踪。其父进程应该希望跟踪子进程。 PTRACE_SINGLESTEP 设置单步执行标志 PTRACE_ATTACH 跟踪指定pid 进程。...data:根据不同的指令 二、gdb使用ptrace的基本流程 gdb调试一个新进程:通过fork函数创建一个新进程,在子进程中执行ptrace(PTRACE_TRACEME, 0, 0, 0)函数,然后通过...在 i386体系结构上(本文中的所有代码都是 i386特定的) ,系统调用号码放在寄存器% eax 中。
graftcp 使用 ptrace(2) 系统调用跟踪或修改任意指定程序的 connect 信息,对任何程序都有效。工作原理后面将会解释。...,大概需要这些条件: fork(2) 一个新进程,通过 execve(2) 启动该 app,并使用 ptrace(2) 进行跟踪,在 app 执行每一次 TCP 连接前,捕获并拦截这次 connect(...如果直接往运行在子进程的被跟踪程序的 buffer 添加信息,可能会造成缓冲区溢出,造成程序崩溃或者覆盖了其他数据。...另外,execve(2) 会分离所有的共享内存,所以也不能通过共享内存的方式让被跟踪的 app 的 write buffer 携带更多的数据,因此这里采用管道方式给 graftcp-local 传递原始的目标地址信息...graftcp 在子进程调用 clone(2) 之前会把它拦截,清除这个 CLONE_UNTRACED 标志位,所以被跟踪的子进程最终还是难逃被跟踪的命运。
strace 命令执行的结果就是按照调用顺序打印出所有的系统调用,包括函数名、参数列表以及返回值。 使用 strace 跟踪一个进程的系统调用的基本流程如下图: ?...创建子进程,在子进程中调用ptrace(PTRACE_TRACEME,0L, 0L, 0L)使其被父进程跟踪,并通过execv函数执行被跟踪的程序。...通过子进程的状态查看子进程是否已正常退出,如果是,则不再跟踪,随后调用ptrace发送PTRACE_DETACH请求解除跟踪关系。 子进程停止后,打印系统调用的函数名、参数和返回值。具体流程见图2。...例如编写一个使用printf打印“Hello world”的程序hello.c,使用strace跟踪该程序的系统调用可以看到如下结果: # ./strace ./hello execve("....跟踪一个正在运行的进程,使用-p选项加上进程的pid。 跟踪某个特定的系统调用,使用-e选项加上系统调用名。
分析Linux系统的执行过程 一、阅读理解task_struct数据结构 二、分析fork函数对应的内核处理过程do_fork 三、使用gdb跟踪分析一个fork系统调用内核处理函数do_fork 四、...理解编译链接的过程和ELF可执行文件格式 五、编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态链接 六、使用gdb跟踪分析一个execve系统调用内核处理函数...八、理解Linux系统中进程调度的时机,可以在内核代码中搜索schedule()函数,看都是哪里调用了schedule(),判断我们课程内容中的总结是否准确; 九、使用gdb跟踪分析一个schedule...六、使用gdb跟踪分析一个execve系统调用内核处理函数do_execve ,验证您对Linux系统加载可执行程序所需处理过程的理解 $ b do_execve 由跟踪结果可知,当调用新的可执行程序时...,会先进入内核态调用do_execve处理函数,并使用堆栈对原来的现场进行保护。
方法2: glibc/libc是对linux系统调用(syscall)的封装,我们使用它是为了简化对系统调用的使用,其实我们可以不用它,直接使用汇编 sysenter/int 0x80指令调用execve...2.混淆进程参数 使用的是linux中另一个syscall: ptrace。...ptrace是用来调试程序用的,使用execve启动进程,相对于自身来说是启动子进程,ptrace 的使用流程一般是这样的: 父进程 fork() 出子进程,子进程中执行我们所想要 trace 的程序,...在子进程调用 exec() 之前,子进程需要先调用一次 ptrace,以 PTRACETRACEME 为参数。...大体的操作流程如下: 第一步:首先我们fork出来一个子进程,然后在子进程中先调用ptrace,接着执行execve("ls xxxxxx"),这个时候基于execve监控到的就是一个假参数。
当然父进程还可以使子进程继续执行,并选择是否忽略引起中止的信号,ptrace可以让一个进程监视和控制另一个进程的执行,并且修改被监视进程的内存、寄存器等,主要应用于断点调试和系统调用跟踪,strace和...当使用了ptrace跟踪后,所有发送给被跟踪的子进程的信号(除了SIGKILL),都会被转发给父进程,而子进程则会被阻塞,这时子进程的状态就会被系统标注为TASK_TRACED,而父进程收到信号后,就可以对停止下来的子进程进行检查和修改...,我们只需要在合适的节点下断点,来观察。...`execl()`函数对应的系统调用为`__NR_execve`,系统调用值为59。 我们来仔细看看库函数execve调用链: ?...PTRACE_CONT 继续执行示被跟踪的子进程,signal为0则忽略引起调试进程中止的信号,若不为0则继续处理信号signal。
2.混淆进程参数 使用的是linux中另一个syscall: ptrace。...ptrace是用来调试程序用的,使用execve启动进程,相对于自身来说是启动子进程,ptrace 的使用流程一般是这样的: 父进程 fork() 出子进程,子进程中执行我们所想要 trace 的程序,...在子进程调用 exec() 之前,子进程需要先调用一次 ptrace,以 PTRACETRACEME 为参数。...大体的操作流程如下: 第一步:首先我们fork出来一个子进程,然后在子进程中先调用ptrace,接着执行execve("ls xxxxxx"),这个时候基于execve监控到的就是一个假参数。...咱们看看有没有用到execve,使用strace打印一下系统调用,没有出现对 ls的调用过程。 为了防止被用户态劫持,里面的所有和系统有关的函数,都是通过系统调用的方式。 ?
$5, %edx int $0x80 其中1为write的系统调用号, 所有的系统调用号码定义在unistd.h文件中....通常用来 作为调试器(如gdb)或用来跟踪各种其他系统调用. 那么,ptrace在程序运行的哪个阶段起作用呢? 答案是在执行系统调用之前....系统调用号59是__NR_execve, 由子进程调用的execl产生. 在上面的例子中我们可以看见, 父进程fork了一个子进程,并且在子进程中进行系统调用....当系统调用出现的时候, 内核会保存原始的rax寄存器值(其中包含系统调用号), 我们可以从子进程的USER段读取这个值, 这里是使用ptrace并且设置第一个参数为PTRACE_PEEKUSER....当我们检查完了系统调用之后, 可以调用ptrace并设置参数PTRACE_CONT让子进程继续运行. 值得一提的是, 这里的child为子进程的进程ID, 由fork函数返回.
这样做得目的是为了提高进程创建的效率,因为子进程全部拷贝父进程的地址空间非常慢且效率低,实际上,子进程几乎不必读或修改父进程拥有的所有资源,在很多情况下,子进程立即调用execve(),并清除父进程之前拷贝过来的地址空间...代码分析 do_fork函数 通过查找pidmap_array位图,为子进程分配新的pid 检查父进程的ptrace字段 调用copy_process()复制进程描述符 调用wake_up_new_task...do_fork通过copy_process函数来创建进程描述符和子进程执行所需要的所有其他内核数据结构。 copy_process函数 检查参数clone_flags所传递标志的一致性。...通过调用security_task_create()以及稍后调用的security_task_alloc()执行所有附加的安全检查 调用dup_task_struct()为子进程获取进程描述符 检查系统中的进程数量...(存放在NR_THREADS变量中)是否超过max_threads变量的值 把tsk->did_exec字段初始化为0:它记录了进程发出的execve()系统调用的次数 把新进程的pid存入tsk->pid
ptrace() 系统调用的使用,这个例子主要介绍怎么使用 ptrace() 系统调用获取当前被调试(追踪)进程的各个寄存器的值,代码如下(ptrace.c): #include ptrace.h...而第二行是由子进程输出的,主要是打印了执行 /bin/ls 程序后输出的结果。 下面解释一下上面程序的执行流程: 主进程调用 fork() 系统调用创建一个子进程。...父进程通过调用 wait() 接收子进程发送过来的信号,并且开始追踪子进程。 父进程通过调用 ptrace(PTRACE_GETREGS, child, ...)...来获取到子进程各个寄存器的值,并且打印寄存器的值。 父进程通过调用 ptrace(PTRACE_CONT, child, ...) 让子进程继续执行下去。...而对于 ptrace() 的所有功能,只能读者自己慢慢看代码来体会了。
0x01 漏洞概述 当调用PTRACE_TRACEME时,ptrace_link函数将获得对父进程凭据的RCU引用,然后将该指针指向get_cred函数。...但是,对象struct cred的生存周期规则不允许无条件地将RCU引用转换为稳定引用。 PTRACE_TRACEME获取父进程的凭证,使其能够像父进程一样执行父进程能够执行的各种操作。...如果恶意低权限子进程使用PTRACE_TRACEME并且该子进程的父进程具有高权限,该子进程可获取其父进程的控制权并且使用其父进程的权限调用execve函数创建一个新的高权限进程。...下载漏洞利用脚本,保存为poc.c文件 https://github.com/bcoles/kernel-exploits/tree/master/CVE-2019-13272 使用gcc编译c文件,生成...运行生成的exp ./exp ? 可以看到已成功利用exp将普通用户test提升为root 查看一下成功利用后的当前用户 ? 查看当前用户的UID,已变为root ?
我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等。其底层的实现方式是基于ptrace特性; Q:strace究竟能做什么呢?...-d 输出strace关于标准错误的调试信息. -f 跟踪由fork调用所产生的子进程....-v 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出. -V 输出strace的版本信息....-p 23489 # 3.指定跟踪相关的系统调用这里监控所有的系统调用 # 跟踪28979进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示...截断输出长度设置与限制跟踪特定的系统调用 strace -f -s10 -o text.txt -e execve .
pid表示被跟踪的子进程,signal为0则忽略引起调试进程中止的信号,若不为0则继续处理信号signal。与PTRACE_CONT不同的是进行系统调用跟踪。...在被跟踪进程继续运行直到调用系统调用开始或结束时,被跟踪进程被中止,并通知父进程。 PTRACE_KILL ptrace(PTRACE_KILL,pid) 杀掉子进程,使它退出。...PTRACE_DETACH ptrace(PTRACE_DETACH,pid) 结束跟踪。 pid表示被跟踪的子进程。结束跟踪后被跟踪进程将继续执行。...此功能将读取所有浮点协处理器387的所有寄存器的值。...此功能将设置所有浮点协处理器387的所有寄存器的值。
ptrace 系统调用起作用,所以如果不允许使用 ptrace,它肯定是不能工作的!...假设 3:ptrace 系统的调用被 seccomp-bpf 规则阻止了 我也知道 Docker 使用 seccomp-bpf 来阻止容器进程运行许多系统调用。...seccomp 规则)获得访问权限,以使用与该能力相关的系统调用。...如果你具有一个像 --CAP_SYS_PTRACE 这样的能力,可以让你使用 process_vm_readv 系统调用,但是该系统调用被 seccomp 配置文件阻止了,那对你没有什么帮助!...所以当你给容器 CAP_SYS_PTRACE 能力时,允许使用 process_vm_readv 和 ptrace 系统调用似乎是一个合理的选择。 就这样!
;数据的传输使用的是共享内存,相对来说也有更好的性能表现。...我们通过内核模块对进程/用户/文件/网络连接进行整理,如果检测到了CMDB相关信息,那么整合后你将会得到一张从网络到主机/容器/业务信息的调用/依赖关系图;如果组织还部署有数据库审计工具的话,整合后你还可以得到数据库的用户...,然后将数据发送给Kafka;并向服务器端发送heartbeat包来进行确认,然后接收并执行服务器发送的指令; 3、代理服务器(可选组件),向代理发送控制指令,查看当前代理的状态和数量等信息; Execve...钩子 通过挂钩sys_execve()/sys_execveat()/compat_sys_execve()/compat_sys_execveat() 实现,使用样例如下: { "uid":"...()实现,使用样例如下: { "uid":"0", "data_type":"101", "ptrace_request":"4", "target_pid":"7402
ptrace系统调用 要自己动手写 strace 的第一步就是了解 ptrace() 系统调用的使用,我们来看看 ptrace() 系统调用的定义: int ptrace(long request, long...由于第一种方式使用跟踪程序来启动被跟踪的程序,所以需要启动两个进程。通常要创建新进程可以使用 fork() 系统调用,所以自然而然地我们也使用 fork() 系统调用。...之后,我们就会在 子进程 中运行被跟踪的程序,而在 父进程 中运行跟踪进程的代码。 运行被跟踪程序 前面说过,被跟踪的程序需要在子进程中运行,而要运行一个程序,可以通过调用 execl() 系统调用。...由于本文介绍怎么跟踪进程调用了哪些 系统调用,所以我们需要使用 ptrace() 的 PTRACE_SYSCALL 命令,代码如下: #include ptrace.h> #include 跟踪了一个系统调用,那么怎么跟踪所有的系统调用呢?很简单,只需要把跟踪的代码放到一个无限循环中即可。
系统调用前,linux在eax寄存器中写入子功能号,中断处理程序根据eax寄存器的值来判断用户进程申请哪种系统调用。...操作系统中断处理流程: 其系统调用执行流程如下: 根据其功能将其主要分为3大类: (1)进程控制类fork 创建一个子进程 clone 按照指定条件创建子进程 execve 运行可执行文件 … (...开启另外的终端,监听本地的4444端口 反向跟踪,可以看到调用的syscall为ptrace 0x06:持久化之文件属性syscall监控 在权限提升和持久化中,设置setuid或setgid位,使应用程序将分别以拥有用户或组的特权运行...snoopy和rsyslog收集所有主机的历史执行命令,snoopy 即是通过 preload 的方式在程序进行 execv() 和 execve() 系统调用的时候记录下所有需要的信息,audit同snoopy...,通过监控execve系统调用,同样实现用户的操纵记录,大部分检测通过检测非ROOT用户执行的命令以及进行威胁建模。
这里我们要注意进程在运行期间中可能处于不同的进程状态,例如:TASK_RUNNING/TASK_STOPPED/TASK_TRACED 等. fork调用 在用户态下,使用fork()创建一个进程。...但是这个时候要检查clone_flags是否被跟踪就是ptrace,ptrace是用来标示一个进程是否被另外一个进程所跟踪。所谓跟踪,最常见的例子就是处于调试状态下的进程被debugger进程所跟踪。...ptrace字段非0时说明debugger程序正在跟踪父进程,那么接下来通过fork_traceflag函数来检测子进程是否也要被跟踪。...如果使用vfork系统调用来创建子进程,那么必然是子进程先执行。原因就是此处vfork完成量所起到的作用:当子进程调用exec函数或退出时就向父进程发出信号。此时,父进程才会被唤醒;否则一直等待。...这也就是为什么使用fork系统调用时父进程会返回子进程pid的原因。
Linux 内核的“ptrace”功能最终使 Strace 发挥其魔力。创建“ptrace”本身是为了促进系统调用跟踪和断点调试。 Strace 至今仍保持开源状态。...在 Strace 自己的文档中,明确指出了以下操作: 附加到正在运行的进程 打印与文件描述符相关的路径和详细信息 按系统调用类型过滤 仅通过特定路径跟踪系统调用 对从文件描述符读取/写入的所有数据执行完整的十六进制和...ASCII 转储 执行系统调用执行注入 计算系统调用总时间、调用和错误 使用 Strace 的复杂性可能有很大差异。...使用 Strace 可以轻松跟踪独立进程;但是,您可能会注意到,Strace 无法捕获命令执行期间您期望的所有信息。这就是子进程发挥作用的地方。您正在跟踪的父进程可能有多个与其关联的辅助进程。...以下是一些常见的 Strace 命令构建块,称为 选项: [-I n] – 指定可中断信号 [-b execve] – 用于从指定的系统调用分离或跟踪多线程进程 [-e expr] – 修改要跟踪的事件或跟踪方式跟踪它们