type
status
date
summary
tags
category
icon
password

Ptrace基本概念

ptrace是linux系统提供的一个系统调用,允许一个进程(tracer)监控,控制另一个进程(tracee)的执行,其核心功能包括:
  • 查看/修改被跟踪进程的寄存器、内存数据
  • 控制被跟踪的进程执行(如单步运行、继续运行、暂停等)
  • 捕获被跟踪进程的信号(如断点信号SIGTRAP)

Prace函数原型

  • request:操作类型,决定ptrace做什么
  • pid:被跟踪进程的pid(若为0,通常指当前进程)
  • addr:被操作的内存地址
  • data:输入/输出数据

Ptrace常见指令

其中PTRACE_GETREGS = 12也就是获取寄存器的操作,通常是获取一组寄存器的值,而这组寄存器通常是存放在一个寄存器结构体中的,这个结构体也是定义在<sys/ptrace.h>头文件当中。64位下的寄存器结构体如下:
父进程可以选取一个地址为起始地址来存放这些寄存器的值,然后根据偏移就很容易获取和修改子进程的寄存器。
💡
更详细的内容可以参考:
  • ptrace使用和调试-CSDN博客

2025NepCTF—smallbox

程序主逻辑是在0xDEADC0DE000往后0x1000字节开辟一块可读可写可执行的空间,然后创建一个子进程,while(1)的存在让子进程陷入无限循环,仅持续运行而不会进行任何操作;接着往开辟的空间读入shellcode,建立沙箱之后再跳转执行shellcode。
程序只允许ptrace的系统调用,利用上述知识,思路应该不难想到:
  • 子进程pid存放在栈上,进而获取pid
  • 父进程附加到子进程,让子进程暂停执行
  • 利用PTRACE_POKEDATA修改子进程的内存,注入getshell的shellcode
  • 利用PTRACE_GETREGS获取子进程的一组寄存器,将其存放在合适地址,根据偏移修改rip的值为注入的shellcode的起始地址
  • 利用PTRACE_SETREGS将父进程改好的寄存器写入子进程
  • 让子进程继续运行
 
值得注意的是父进程的shellcode最后要添加一个无限循环,不然父进程结束运行结束了子进程也会随之停止。
 
模板说明工具篇
Loading...