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博客
ptrace使用和调试-CSDN博客
文章浏览阅读6.2k次,点赞35次,收藏78次。本文围绕Linux ptrace函数展开,介绍其函数原型,阐述基本用法及被调用进程信息获取,包括寄存器、内存信息获取和断点插入。还讲述调试程序的方法,如获取程序符号表、基地址,封装内存读写函数,插入断点,以及附加进程调试,并给出封装的命令。
2025NepCTF—smallbox
程序主逻辑是在0xDEADC0DE000往后0x1000字节开辟一块可读可写可执行的空间,然后创建一个子进程,while(1)的存在让子进程陷入无限循环,仅持续运行而不会进行任何操作;接着往开辟的空间读入shellcode,建立沙箱之后再跳转执行shellcode。
程序只允许ptrace的系统调用,利用上述知识,思路应该不难想到:
- 子进程pid存放在栈上,进而获取pid
- 父进程附加到子进程,让子进程暂停执行
- 利用PTRACE_POKEDATA修改子进程的内存,注入getshell的shellcode
- 利用PTRACE_GETREGS获取子进程的一组寄存器,将其存放在合适地址,根据偏移修改rip的值为注入的shellcode的起始地址
- 利用PTRACE_SETREGS将父进程改好的寄存器写入子进程
- 让子进程继续运行
值得注意的是父进程的shellcode最后要添加一个无限循环,不然父进程结束运行结束了子进程也会随之停止。
- Author:Estara
- URL:http://preview.tangly1024.com/article/2403139c-9ee7-8046-8b6e-eadb472caf16
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!