首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用ptrace跟踪跨子节点的所有execve()调用

使用ptrace跟踪跨子节点的所有execve()调用

背景

ptrace是一种在Linux系统中用于调试和跟踪进程的机制。它允许一个进程(称为追踪器)控制另一个进程(称为被追踪者)的执行。通过ptrace,我们可以在被追踪者的关键点暂停执行,检查其内存和寄存器,甚至修改它们。

execve()是一个Linux系统调用,用于在当前进程中执行一个新的程序。它接受三个参数:要执行的程序的文件名、一个指向字符串数组的指针(表示程序的参数)和一个指向字符串数组的指针(表示程序的环境变量)。

问题

在某些情况下,我们可能需要跟踪一个进程及其子进程中的所有execve()调用。这可能是为了调试、安全审计或其他目的。然而,由于execve()通常会创建一个新的地址空间,因此在跨越子进程的上下文中跟踪它可能会变得复杂。

解决方案

为了解决这个问题,我们可以使用ptrace来跟踪一个进程及其子进程中的所有execve()调用。以下是一个简单的步骤:

  1. 使用ptrace附加到目标进程。
  2. 在目标进程中设置一个断点,当execve()系统调用被调用时触发。
  3. 当断点触发时,检查堆栈跟踪以确定调用来自哪个进程。
  4. 如果调用来自子进程,则继续跟踪子进程。
  5. 如果调用来自父进程,则继续跟踪父进程。
  6. 重复步骤2-5,直到达到所需的跟踪深度。

注意事项

使用ptrace跟踪进程可能会导致一些问题,例如性能下降、安全问题和死锁。因此,在使用ptrace进行跟踪时,应该谨慎操作并遵循最佳实践。

推荐的腾讯云相关产品

腾讯云提供了多种云计算产品,可以帮助用户解决跨子节点跟踪execve()调用的问题。以下是一些可能有用的产品:

  • 腾讯云服务器:提供可扩展的虚拟服务器,可以在其上部署和运行自定义应用程序。
  • 腾讯云容器服务:提供容器化部署解决方案,可以帮助用户更轻松地管理和跟踪容器化应用程序。
  • 腾讯云云原生:提供一系列云原生相关的产品和服务,可以帮助用户构建可扩展、高可用和安全的应用程序。

产品介绍链接地址

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

吃土记之GDB调试原理

如果您正在考虑使用复杂内核编程来完成任务, 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 中。

1.1K20
  • 终端程序不支持 SOCKS5 HTTP 代理怎么办?有了这个神器后,终于可以跨越高山和大海了!

    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 标志位,所以被跟踪进程最终还是难逃被跟踪命运。

    5.8K21

    df 和 ls 命令执行夯主

    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选项加上系统调用名。

    2K10

    分析Linux系统执行过程

    分析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处理函数,并使用堆栈对原来现场进行保护。

    92120

    反弹shell-逃逸基于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监控到就是一个假参数。

    3.1K20

    linux-沙盒入门,ptrace从0到1

    当然父进程还可以使进程继续执行,并选择是否忽略引起中止信号,ptrace可以让一个进程监视和控制另一个进程执行,并且修改被监视进程内存、寄存器等,主要应用于断点调试和系统调用跟踪,strace和...当使用ptrace跟踪后,所有发送给被跟踪进程信号(除了SIGKILL),都会被转发给父进程,而进程则会被阻塞,这时进程状态就会被系统标注为TASK_TRACED,而父进程收到信号后,就可以对停止下来进程进行检查和修改...,我们只需要在合适节点下断点,来观察。...`execl()`函数对应系统调用为`__NR_execve`,系统调用值为59。 我们来仔细看看库函数execve调用链: ?...PTRACE_CONT 继续执行示被跟踪进程,signal为0则忽略引起调试进程中止信号,若不为0则继续处理信号signal。

    4.1K30

    无命令反弹shell-逃逸基于execve命令监控(上)

    2.混淆进程参数 使用是linux中另一个syscall: ptrace。...ptrace是用来调试程序用使用execve启动进程,相对于自身来说是启动进程,ptrace 使用流程一般是这样: 父进程 fork() 出进程,进程中执行我们所想要 trace 程序,...在进程调用 exec() 之前,进程需要先调用一次 ptrace,以 PTRACETRACEME 为参数。...大体操作流程如下: 第一步:首先我们fork出来一个进程,然后在进程中先调用ptrace,接着执行execve("ls xxxxxx"),这个时候基于execve监控到就是一个假参数。...咱们看看有没有用到execve,使用strace打印一下系统调用,没有出现对 ls调用过程。 为了防止被用户态劫持,里面的所有和系统有关函数,都是通过系统调用方式。 ?

    1.6K20

    进程描述和创建

    这样做得目的是为了提高进程创建效率,因为进程全部拷贝父进程地址空间非常慢且效率低,实际上,进程几乎不必读或修改父进程拥有的所有资源,在很多情况下,进程立即调用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

    89430

    Linux Hook 笔记

    $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函数返回.

    2.8K60

    GDB原理之ptrace实现原理

    ptrace() 系统调用使用,这个例子主要介绍怎么使用 ptrace() 系统调用获取当前被调试(追踪)进程各个寄存器值,代码如下(ptrace.c): #include <sys/ptrace.h...而第二行是由进程输出,主要是打印了执行 /bin/ls 程序后输出结果。 下面解释一下上面程序执行流程: 主进程调用 fork() 系统调用创建一个进程。...父进程通过调用 wait() 接收进程发送过来信号,并且开始追踪进程。 父进程通过调用 ptrace(PTRACE_GETREGS, child, ...)...来获取到进程各个寄存器值,并且打印寄存器值。 父进程通过调用 ptrace(PTRACE_CONT, child, ...) 让进程继续执行下去。...而对于 ptrace() 所有功能,只能读者自己慢慢看代码来体会了。

    4.4K20

    系统与应用异常定位诊断

    我们用它来监控用户空间进程和内核交互,比如系统调用、信号传递、进程状态变更等。其底层实现方式是基于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 .

    78121

    CVE-2019-13272:Linux本地内核提权漏洞复现

    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 ?

    3.2K30

    AgentSmith-HIDS:一套轻量级高性能基于主机入侵检测系统

    ;数据传输使用是共享内存,相对来说也有更好性能表现。...我们通过内核模块对进程/用户/文件/网络连接进行整理,如果检测到了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

    2.3K30

    自己动手写一个 strace

    ptrace系统调用 要自己动手写 strace 第一步就是了解 ptrace() 系统调用使用,我们来看看 ptrace() 系统调用定义: int ptrace(long request, long...由于第一种方式使用跟踪程序来启动被跟踪程序,所以需要启动两个进程。通常要创建新进程可以使用 fork() 系统调用,所以自然而然地我们也使用 fork() 系统调用。...之后,我们就会在 进程 中运行被跟踪程序,而在 父进程 中运行跟踪进程代码。 运行被跟踪程序 前面说过,被跟踪程序需要在进程中运行,而要运行一个程序,可以通过调用 execl() 系统调用。...由于本文介绍怎么跟踪进程调用了哪些 系统调用,所以我们需要使用 ptrace() PTRACE_SYSCALL 命令,代码如下: #include #include <...上面的程序只跟踪了一个系统调用,那么怎么跟踪所有的系统调用呢?很简单,只需要把跟踪代码放到一个无限循环中即可。

    51520

    入侵检测之syscall监控

    系统调用前,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用户执行命令以及进行威胁建模。

    2.6K10

    Strace——隐藏超能力

    Linux 内核ptrace”功能最终使 Strace 发挥其魔力。创建“ptrace”本身是为了促进系统调用跟踪和断点调试。 Strace 至今仍保持开源状态。...在 Strace 自己文档中,明确指出了以下操作: 附加到正在运行进程 打印与文件描述符相关路径和详细信息 按系统调用类型过滤 仅通过特定路径跟踪系统调用 对从文件描述符读取/写入所有数据执行完整十六进制和...ASCII 转储 执行系统调用执行注入 计算系统调用总时间、调用和错误 使用 Strace 复杂性可能有很大差异。...使用 Strace 可以轻松跟踪独立进程;但是,您可能会注意到,Strace 无法捕获命令执行期间您期望所有信息。这就是进程发挥作用地方。您正在跟踪父进程可能有多个与其关联辅助进程。...以下是一些常见 Strace 命令构建块,称为 选项: [-I n] – 指定可中断信号 [-b execve] – 用于从指定系统调用分离或跟踪多线程进程 [-e expr] – 修改要跟踪事件或跟踪方式跟踪它们

    43010

    fork系统调用分析

    这里我们要注意进程在运行期间中可能处于不同进程状态,例如:TASK_RUNNING/TASK_STOPPED/TASK_TRACED 等. fork调用 在用户态下,使用fork()创建一个进程。...但是这个时候要检查clone_flags是否被跟踪就是ptraceptrace是用来标示一个进程是否被另外一个进程所跟踪。所谓跟踪,最常见例子就是处于调试状态下进程被debugger进程所跟踪。...ptrace字段非0时说明debugger程序正在跟踪父进程,那么接下来通过fork_traceflag函数来检测进程是否也要被跟踪。...如果使用vfork系统调用来创建进程,那么必然是进程先执行。原因就是此处vfork完成量所起到作用:当进程调用exec函数或退出时就向父进程发出信号。此时,父进程才会被唤醒;否则一直等待。...这也就是为什么使用fork系统调用时父进程会返回进程pid原因。

    1K30
    领券