c系函数总结
Linux c函数
内存控制
mprotect函数
常用于SMC技术
.
用于更改一段内存的保护属性,例如将可读写的内存区域变为只读,或者将只读的内存区域变为可执行等.
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系统调用来实现的.
函数签名:
1 |
|
- 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
状态.
OpenSSL
DEC相关
DES_string_to_key()函数
用于将字符串转换为 DES 密钥,函数原型为:
1 | int DES_string_to_key(const char *str, DES_cblock *key); |
- str是包含 8 个字符的字符串
- key用于存储生成的密钥的
DES_cblock
结构
DES_set_key_checked()函数
用于设置 DES 密钥并检查密钥的奇偶校验位,函数原型为:
1 | int DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule); |
其目的是设置 DES 密钥并检查奇偶校验.
key
是输入的密钥,是一个8字节的DES密钥块.schedule
是输出参数,是一个DES_key_schedule
结构,用于保存生成的密钥.
DES_ncbc_encrypt()函数
用于 Cipher Block Chaining (CBC) 模式的 DES 加密,函数原型如下:
1 | void DES_ncbc_encrypt(const unsigned char *input, unsigned char *output, long length,DES_key_schedule *schedule, DES_cblock *ivec, int encrypt); |
schedule
为DES密钥的调度数组.ivec
是初始化向量iv.encrypt
一个整数,非零为加密,零为解密.