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

如何使用ptrace(2)来改变syscall的行为?我的例子不起作用,为什么?

ptrace(2)是一个系统调用,用于跟踪和控制其他进程的执行。它可以用于改变syscall的行为,但需要特定的权限和正确的使用方法。

要使用ptrace(2)来改变syscall的行为,可以按照以下步骤进行:

  1. 引入头文件:#include <sys/ptrace.h>
  2. 使用ptrace(PTRACE_TRACEME, 0, NULL, NULL)来启用跟踪当前进程。这将使当前进程成为被跟踪进程。
  3. 使用ptrace(PTRACE_PEEKUSER, pid, offset, NULL)ptrace(PTRACE_POKEUSER, pid, offset, data)来读取和修改被跟踪进程的寄存器值。syscall号通常存储在寄存器中。
  4. 使用ptrace(PTRACE_SYSCALL, pid, NULL, NULL)来让被跟踪进程执行下一个syscall。
  5. 使用ptrace(PTRACE_GETREGS, pid, NULL, &regs)来获取被跟踪进程的寄存器状态。
  6. 修改寄存器中的syscall号,然后使用ptrace(PTRACE_SETREGS, pid, NULL, &regs)来设置被跟踪进程的寄存器状态。
  7. 使用ptrace(PTRACE_CONT, pid, NULL, NULL)来继续执行被跟踪进程。

以上是使用ptrace(2)来改变syscall行为的基本步骤。但是,如果你的例子不起作用,可能有以下几个原因:

  1. 权限问题:使用ptrace(2)需要特定的权限,通常需要以root用户或具有相应权限的用户身份运行。
  2. 被跟踪进程已经被其他进程跟踪:如果被跟踪进程已经被其他进程使用ptrace(2)跟踪,那么你将无法再使用ptrace(2)来改变其行为。
  3. 错误的使用方法:ptrace(2)是一个强大而复杂的系统调用,需要正确的使用方法。可能是你在使用过程中出现了错误,导致例子不起作用。
  4. 系统限制:某些系统可能对ptrace(2)的使用有限制,例如限制跟踪特定进程或特定类型的进程。

如果你的例子不起作用,建议检查以上可能的原因,并确保你具有足够的权限和正确的使用方法。如果问题仍然存在,可以提供更多的细节和代码示例,以便更好地帮助你解决问题。

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

相关·内容

Linux Hook 笔记

通过Hook,我们可以暂停系统调用,或者通过改变系统调用参数来改变正常输出结果, 甚至可以中止一个当前运行中进程并且将控制权转移到自己手上....并且用syscall指令而不是80中断 进行系统调用. 相同之处是都用寄存器%rax保存调用号和返回值....void *addr, void *data); 其中第一个参数决定了ptrace行为以及其他参数含义, request值可以是下列值中一个: PTRACE_TRACEME...在系统调用追踪中, 常见流程如下图所示: ptrace 读取系统调用参数 系统调用参数按顺序存放在rbx,rcx…之中,因此以write系统调用为例看如何读取寄存器值: #include <sys...追踪其他程序进程 上面举例子都是追踪并修改声明了PTRACE_TRACEME子进程,那么我们能否追踪其他独立正在运行进程呢?

2.8K60

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

方法2: glibc/libc是对linux系统调用(syscall)封装,我们使用它是为了简化对系统调用使用,其实我们可以不用它,直接使用汇编 sysenter/int 0x80指令调用execve...方法很简单,就是不使用execve系统调用。(不是废话) 大家想想为什么会有反弹shell? 为什么要弹shell?...其实是我们想借用linux中自带系统命令达到我们目的,尤其是在linux中以系统命令操作为主。 以 ls 命令为例子,功能是查看目录中有哪些文件,假如我们不想使用ls命令,那我们有什么办法呢?...2.混淆进程参数 使用是linux中另一个syscall: ptrace。...其实需求很简单: 既想要linux命令原有的功能,又不想用execve syscall方式启动。 想了想,怎么办呢? 暂时不写了,删了一次,有点敏感,还望见谅 ?

3.1K20
  • 如何利用Ptrace拦截和模拟Linux系统调用

    这里“拦截”指的是tracer能够改变系统调用参数,改变系统调用返回值,甚至屏蔽特定系统调用。...在这篇文章中,将主要讨论x86-64架构下Linux Ptrace,并且还会使用到一些特定Linux扩展。除此之外,可能会忽略错误检查,但最终发布完整源码将会解决这些问题。..., 0, 0, 0); execvp(argv[1], argv + 1); FATAL("%s", strerror(errno)); } 父进程将使用wait(2)等待子进程...打印系统调用返回值。 PTRACE_SYSCALL请求可以完成等待下一个系统调用以及等待系统调用结束这两个任务,跟之前一样,这里也需要使用wait(2)等待tracee进入特定状态。...读取寄存器还需要其他Ptrace调用,但这里就不需要wait(2)了,因为tracee并不会改变状态。

    1.9K70

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

    喜欢的话,请大家一定点在看,并分享出去,算是对原创最大支持了。如何想看新方法,直接到最后。...方法2: glibc/libc是对linux系统调用(syscall)封装,我们使用它是为了简化对系统调用使用,其实我们可以不用它,直接使用汇编 sysenter/int 0x80指令调用execve...其实是我们想借用linux中自带系统命令达到我们目的,尤其是在linux中以系统命令操作为主。 以 ls 命令为例子,功能是查看目录中有哪些文件,假如我们不想使用ls命令,那我们有什么办法呢?...2.混淆进程参数 使用是linux中另一个syscall: ptrace。...其实需求很简单: 既想要linux命令原有的功能,又不想用execve syscall方式启动。 想了想,为什么不能将linux 命令直接当成shellcode执行呢?

    1.6K20

    linuxso注入与热更新原理

    , void *data); 通过设置request值,实现具体操作,本文用到大部分如下: PTRACE_ATTACH:关联上目标进程 PTRACE_GETREGS:读目标进程寄存器 PTRACE_SETREGS...用户函数调用 前面说到,我们希望让目标进程调用dlopen(target.so),实现target.so注入。抽象出来,就是如何让目标进程调用一个用户函数(即,非系统调用函数)。...解决方法是调用一下系统调用mmap申请内存,抽象一下,就是如何让目标进程调用系统调用 系统调用 系统调用比较简单,查阅相关资料,系统调用寄存器及含义如下: rdi:参数1 rsi:参数2 rdx:参数...都准备好,让目标进程执行一个syscall指令就开始调用了。 剩下问题就是rip怎么处理?以及如何拿到返回值? 函数执行 我们期望函数能够跑某段机器码,即设置一个rip。...在数组里写入一个syscall指令 [0x0f, 0x05] 函数返回值 当目标进程执行完syscall后,如何断住,能让本进程拿到返回值,比较简单,直接在前面的code空间里,写入int3断点指令,再填满无用指令

    11.4K50

    吃土记之GDB调试原理

    老王:gdb调试呀 小王:gdb 为什么可以非侵入调试进程呀。 老王:这个没想过。。。平时不考虑这个问题 gdb基本上大家都在用,你有没有想过它实现原理是什么?...为什么它可以控制程序执行、中断、访问内存甚至直接使程序流程改变? 在使用gdb调试程序时,程序进程状态是”T”,但又似乎并非接到了SIGSTOP信号, 那么这个”T”是什么呢?...如果您正在考虑使用复杂内核编程完成任务, PTRACE_TRACEME 请三思。Linux 提供了一种优雅机制实现所有这些功能: ptrace (进程跟踪)系统调用。...gdb主要功能实现依赖于一个系统函数ptrace,通过man手册可以了解到, ptrace可以让父进程观察和控制其子进程检查、执行,改变其寄存器和内存内容, 可以使程序员在程序运行时候观察程序在内存...,%ecx movl $5, %edx int $0x80 例子 demo :使用PTRACE_ME实现父进程跟踪子进程 root@money:~/code/c++/temo# cat ptrace.c

    1.1K20

    自己动手写一个 strace

    ptrace系统调用 要自己动手写 strace 第一步就是了解 ptrace() 系统调用使用,我们来看看 ptrace() 系统调用定义: int ptrace(long request, long...ptrace() 系统调用也提供了两种 request 实现上面两种方式: 第一种通过 PTRACE_TRACEME 实现 第二种通过 PTRACE_ATTACH 实现 本文我们主要介绍使用第一种方式...由于第一种方式使用跟踪程序启动被跟踪程序,所以需要启动两个进程。通常要创建新进程可以使用 fork() 系统调用,所以自然而然地我们也使用 fork() 系统调用。...由于本文介绍怎么跟踪进程调用了哪些 系统调用,所以我们需要使用 ptrace() PTRACE_SYSCALL 命令,代码如下: #include #include <..., 那么终止跟踪 break; } } } return 0; } 上面例子添加了一个函数 find_syscall_symbol

    51520

    深入Android源码系列(二) HOOK技术大作战

    ,然后演示下如何使用它,里面用到哪些技术函数。...01 演示如何hook本进程某个方法,具体demo演示为: 这里用到方法为(关于编译,直接给出这边项目,自己去下载编译吧,需要配置ndk即可) registerInlineHook 参数为:...processThreadPC 处理代码 PTRACE_GETREGS PTRACE_SETREGS 两个参数,实现修改寄存器。...intercept_syscall 实现修改syscall 这里具体为: get_syscall_number 从寄存器里面拿到syscall num 具体是 ptrace(PTRACE_GETREGS...syscall 04 第二个例子,hook 具体某个方法 (这里它demo演示比较随意,并且有些小问题,我们讲下原理即可) 我们向远程进程注入代码时候,根本实现方法是使用poke_data

    1.4K50

    linuxso注入与热更新原理 | 直播回顾

    , void *data); 通过设置request值,实现具体操作,本文用到大部分如下: PTRACE_ATTACH:关联上目标进程 PTRACE_GETREGS:读目标进程寄存器 PTRACE_SETREGS...用户函数调用 前面说到,我们希望让目标进程调用dlopen(target.so),实现target.so注入。抽象出来,就是如何让目标进程调用一个用户函数(即,非系统调用函数)。 那么如何调用?...解决方法是调用一下系统调用mmap申请内存,抽象一下,就是如何让目标进程调用系统调用 系统调用 系统调用比较简单,查阅相关资料,系统调用寄存器及含义如下: rdi:参数1 rsi:参数2 rdx:参数...都准备好,让目标进程执行一个syscall指令就开始调用了。 剩下问题就是rip怎么处理?以及如何拿到返回值? 函数执行 我们期望函数能够跑某段机器码,即设置一个rip。...在数组里写入一个syscall指令 [0x0f, 0x05] 函数返回值 当目标进程执行完syscall后,如何断住,能让本进程拿到返回值,比较简单,直接在前面的code空间里,写入int3断点指令,再填满无用指令

    1.5K10

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

    为什么还要dynsym表?...或者直接使用strings字符搜索 ? 反转(防): 因为我们上一个使用了字符串,字符串是一个常量,常量不可以改变修改,且无法隐藏,那如果我们把ptrace定义为字符数组勒?...绕过简单ptrace 上面谈论到ptrace在隐藏过程中攻防博弈,并没有说如何绕过ptrace,接下来我们讲如何绕过ptrace一些手段。...\n"); return 0; } 这里编译为64位 通过函数返回值是否为-1判断,是否正在被调试,如果我们直接修改ptrace返回值,就可以绕过判断,ptrace函数执行之后返回值将会保存在...3.使用LD_PRELOAD劫持ptrace函数调用 这里只针对那些动态链接共享库程序,局限性很大,通过创键本地自定义伪造库,使用LD_PRELOAD劫持ptrace调用库为我们自定义伪造库

    4.1K30

    Chaos Mesh® 技术内幕 | 如何注入 IO 故障?

    很多项目都这么叫,但是这种称呼将实现给隐藏了,也没省太多字,不是很喜欢)。接下来我们将展示如何使用 Mutating Webhook 达到以上目的。...该如何恢复?毕竟在有文件被打开情况下是无法 umount 。 后文将用同一个手段解决这两个问题:使用 ptrace 方法在运行时替换已经打开 fd。...系统调用,以相同 OFlags 打开 /var/run/test/a,假设 fd 为 2使用 lseek 改变新打开 fd 2 seek 位置; 使用 dup2(2, 1) 用新打开 fd...使用 ptrace 让目标进程运行替换 fd 程序 那么只要结合“使用 ptrace 能够让 tracee 运行任意二进制程序”知识和“使用dup2替换自己已经打开fd”方法,就能够让 tracee...然后用 ptrace 让目标进程运行这段程序,就完成了在运行时对 fd 替换。 读者可以稍稍思考如何使用类似的方式改换 cwd,替换 mmap 呢?它们流程完全是类似的。

    1.2K00

    一种Linux下ptrace隐藏注入shellcode技术和防御方法

    【图1 ptrace控制流程】 1) tracer调用PTRACE_ATTACH功能关联指定tracee,向tracee发送SIGSTOP信号,并调用waitpid等待tracee状态改变2) 当...tracee状态变成STOP,waitpid返回; 3) tracer调用PTRACE_SYSCALL功能让tracee进入单步执行状态,并调用waitpid等待tracee状态改变; 4) 重复步骤2...三、技术 达成隐藏注入shellcode目标需要解决三个问题: 1) shellcode存放在哪里? 2) 如何执行shellcode? 3) 如何不被轻易发现正在运行shellcode?...1:一个进程只能对下属子进程或线程使用PTRACE_ATTACH功能。 2:只有拥有CAP_SYS_PTRACE权限进程能够对其它进程使用PTRACE_ATTACH功能。...3:任何进程均不能使用PTRACE_ATTACH或PTRACE_TRACEME功能,并且参数ptrace_scope取值不能改变

    1.3K20

    分歧还是共存?详解Android内核安全

    二、生成内核配置 对于具有极简defconfig设备,您可以使用以下命令启用选项,生成一个.config文件,使用该文件保存新defconfig或编译一个启用Android功能新内核:.../exit() (arm64:审计:在 syscall_trace_enter/exit() 中添加审计钩),作者:JP Abgrall 4.9499cd2 syscall_get_arch: remove...ARM:8087/1:ptrace:在 secure_computing() 检查后重新加载系统调用号),作者:Will Deacon 18.abbfed9 arm64: ptrace: add PTRACE_SET_SYSCALL...(arm64:ptrace:添加 PTRACE_SET_SYSCALL),作者:AKASHI Takahiro 19.feb2843 arm64: ptrace: allow tracer to...大多数漏洞被攻击者所利用,他们会改变应用正常控制流,获取遭利用应用所有权限执行任意恶意活动。

    1.5K30

    iOS小技能:__attribute__应用

    I __attribute__应用案例 1.1 代码注入 ARM (通过汇编调用svc实现用户态到内核态转换) // 使用inline方式将函数在调用处强制展开,防止被hook和追踪符号 static...__((nonnull (1, 2))); 1.5 确保线程在应用整个生命周期内都能一直运行 AFNetworking 在网络请求线程入口使用 noreturn 属性,用于网络请求 NSThread...3.1 syscall syscall是通过软中断实现从用户态到内核态,syscall (26,31,0,0)调用系统函数ptrace(PT_DENY_ATTACH, 0, 0, 0);。...ptrace系统调用函数号是26,31是PT_DENY_ATTACH(用于告诉系统阻止调试器依附)。int syscall(int, ...).../blog.csdn.net/z929118967/article/details/84612698 运行时期,断点ptrace,直接返回 分析如何调用ptrace,hook ptrace 通过tweak

    34020

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

    但是它可以作为一个高性能主机信息收集工具帮助安全研究人员构建属于自己HIDS。...而AgentSmit-HIDS优秀特性(从内核态获取尽可能完整数据)在跟用户态HIDS相比,拥有巨大优势: 1、性能更优秀:通过内核态驱动获取相关信息,无需进行类似“遍历/proc”这样操作提升性能或进行数据补全...;数据传输使用是共享内存,相对来说也有更好性能表现。...2、更加难以躲避和绕过:由于我们信息获取来自于内核态驱动,因此面对很恶意行为都无法绕过AgentSmith-HIDS检测。...AgentSmith-HIDS实现了以下几个主要功能: 1、内核栈模块通过Kprobe针对 execve、通信连接、进程注入、文件创建、DNS查询和LKM加载等行为设置了钩子,并且通过兼容Linux命名空间对容器环境进行监控

    2.3K30

    df 和 ls 命令执行夯主

    ,但是 ls 其他目录时候就没有事情 2,df 查看文件挂载时候也卡住, 3,什么都没干啊,就做了一个 ISCSI 其实他说第二点问题时候就已经猜到问题所在了,那不就是远程挂载磁盘非正常掉了...但是他说 ISCSI 这个玩意时候不知道是啥,于是查了一下,有兴趣同学可以看看这是:https://zhuanlan.zhihu.com/p/60986068,看出来他是一个网络存储,那么就更加坚定想法了...找到是哪个挂载点失效了 我们可以使用此命令查找挂载点哪个地方失效了。.../post/linux-ptrace-api-introduce.html 使用 strace 最简单 strace 命令用法就是: strace PROG;PROG 就是要执行程序(linux...通过PTRACE_SYSCALL让子进程继续运行,由于这个请求会让子进程在系统调用入口处和系统调用完成时都会停止并通知父进程,这样,父进程就可以在系统调用开始之前获得参数,结束之后获得返回值。

    2K10

    GDB原理之ptrace实现原理

    本文不是介绍 GDB 使用方式,而是大概介绍 GDB 实现原理,当然 GDB 是一个庞大而复杂项目,不可能只通过一篇文章就能解释清楚,所以本文主要是介绍 GDB 使用核心技术 - ptrace...ptrace() 系统调用详细介绍可以参考以下链接:https://man7.org/linux/man-pages/man2/ptrace.2.html ptrace使用示例 下面通过一个简单例子来说明...ptrace() 系统调用使用,这个例子主要介绍怎么使用 ptrace() 系统调用获取当前被调试(追踪)进程各个寄存器值,代码如下(ptrace.c): #include <sys/ptrace.h...从上面的例子可以知道,通过向 ptrace() 函数 request 参数传入不同值时,就有不同效果。...本来使用 ptrace 实现一个简单调试工具,但在网上找到了一位 Google 大神 Eli Bendersky 写了类似的系列文章,所以我就不再重复工作了,在这里贴一下文章链接: https

    4.4K20

    为什么 strace 在 Docker 中不起作用

    在编辑“容器如何工作”爱好者杂志能力页面时,想试着解释一下为什么 strace 在 Docker 容器中无法工作。...这个问题很容易解决 —— 在机器上,是这样解决: docker run --cap-add=SYS_PTRACE -it ubuntu:18.04 /bin/bash 但我对如何修复它不感兴趣,...为什么?! 假设 2:关于用户命名空间事情? 下一个(没有那么充分依据)假设是“嗯,也许这个过程是在不同用户命名空间里,而 strace 不能工作,因为某种原因而行不通?”...假设 3:ptrace 系统调用被 seccomp-bpf 规则阻止了 也知道 Docker 使用 seccomp-bpf 阻止容器进程运行许多系统调用。...这是个有趣小事情,认为这是一个很好例子,说明了容器是由许多移动部件组成,它们以不完全显而易见方式一起工作。

    6.4K30
    领券