Linux c函数

内存控制

mprotect函数

常用于SMC技术.

用于更改一段内存的保护属性,例如将可读写的内存区域变为只读,或者将只读的内存区域变为可执行等.

pwn中常用于修改.bss段的属性以此来绕过NX保护.

函数原型:

int mprotect(void *addr, size_t len, int prot);

参数说明:

  • addr:要更改保护属性的内存区域的起始地址。
  • len:内存区域的长度(以字节为单位)。
  • prot:新的保护权限,可以是 PROT_NONEPROT_READPROT_WRITEPROT_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_READPROT_WRITEPROT_EXEC 等的组合。
  • flags:映射选项,如 MAP_SHAREDMAP_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
2
#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种方法:

  1. tracee进程调用ptrace系统调用,request参数传递PTRACE_TRACEME值,表示想要被tracer进程追踪.通过这种方式的进程想要进入Traced状态有两种方式:
    1. 主动调用exec系列的系统调用;
    2. tracer发送进入Traced状态的相关信号.
  2. 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
2
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一个整数,非零为加密,零为解密.