函数总结
Linux c函数
内存控制
mprotect函数
用于更改一段内存的保护属性,例如将可读写的内存区域变为只读,或者将只读的内存区域变为可执行等.
pwn中常用于修改.bss段的属性以此来绕过NX保护.
函数原型:
int mprotect(void *addr, size_t len, int prot);
参数说明:
addr:要更改保护属性的内存区域的起始地址。len:内存区域的长度(以字节为单位)。prot:新的保护权限,可以是PROT_NONE、PROT_READ、PROT_WRITE、PROT_EXEC等的组合。
mprotect 函数返回 0 表示成功,返回 -1 表示失败,并设置相应的错误码。
mmap函数
用于内存映射,可以用于简化例如进程间通信---IPC需要4次数据复制,而内存映射到共享区只需2次复制即可
函数原型:
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
参数说明:
addr:映射的起始地址,通常为NULL,由系统自动分配。length:映射区域的大小,以字节为单位。prot:映射区域的保护权限,可以是PROT_READ、PROT_WRITE、PROT_EXEC等的组合。flags:映射选项,如MAP_SHARED、MAP_PRIVATE等。fd:文件描述符,表示要映射的文件或设备。offset:映射的偏移量,表示从文件的哪个位置开始映射。
mmap 返回一个指向映射区域的指针,如果映射失败,则返回 MAP_FAILED。
read函数
用于读取文件---linux一切皆文件,从打开的文件描述符中读取
函数原型:
ssize_t read(int fd, void *buf, size_t count);
参数为:
文件描述符,读入到的缓冲区,读取的字节数
write函数
用于读取文件---linux一切皆文件,从打开的文件描述符中写入
函数原型:
ssize_t write(int fd, const void *buf, size_t count);
参数为:
文件描述符,制定从哪个缓冲区用于写入,写入的字节数
进程控制
prctl函数
int prctl(int option,unsigned long arg2,unsigned long arg3,unsigned long arg4,unsigned long arg5)
prctl()是一个系统调用函数,用于为进程指定不同的选项和参数,其选项取决于参数option.
ptrace函数
即process trace,顾名思义,该函数可以提供追踪进程执行状态的功能。根据官方手册的介绍:ptrace()系统调用为一个进程提供了观察和控制另一个进程的执行过程的能力,同时也提供检查和改变另一个进程的内存值以及相关注册信息。其中,被控制的进程被称为tracee,控制进程被称为tracer.
因此gdb,strace等工具都是基于ptrace系统调用来实现的.
函数签名:
#include <sys/ptrace.h>
long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data);
- request:要执行的操作类型;
- pid:被追踪的目标进程ID;
- addr:被监控的目标内存地址;
- data:保存读取出或者要写入的数据.
Linux的T进程状态,即Stopped or Traced,Traced类型是由trace系统调用提供的一个进程状态.
Stopped状态
例如可以在输入时用ctrl+z组合键来中止输入操作,让该进程变成中止状态.
再次使用fg命令即可恢复进程状态.
Traced状态
通过ptrace系统调用可以让进程进入Trace状态,有2种方法:
- tracee进程调用
ptrace系统调用,request参数传递PTRACE_TRACEME值,表示想要被tracer进程追踪.通过这种方式的进程想要进入Traced状态有两种方式:- 主动调用
exec系列的系统调用; tracer发送进入Traced状态的相关信号.
- 主动调用
- racecer进程调用
ptrace系统调用,request参数传递PTRACE_ATTACH这个值,并给出tracee进程的pid,从而让tracee进程进入Traced状态.

浙公网安备 33010602011771号