函数合集
这篇文章用于记录函数的详细信息
c
setbuf
setbuf
函数用于设置文件流的缓冲区。它允许你指定一个用户提供的缓冲区,用于文件的输入输出操作
1 | void setbuf(FILE *stream, char *buf); |
setbuf
只有全缓冲或无缓冲
参数 | 含义 |
---|---|
stream |
要设置缓冲区的文件流。 |
buf |
用户提供的缓冲区。如果 buf 为 NULL ,则禁用缓冲。 |
文件流 | 含义 |
---|---|
stdio |
标准输入流 |
stdout |
标准输出流 |
stderr |
标准错误流 |
缓冲模式 | 对应字符 |
---|---|
无缓冲_IONBF |
0 或 NULL |
全缓冲_IOFBF |
2 |
setvbuf
1 | int setvbuf(FILE *stream, char *buf, int mode, size_t size); |
参数:
1 | stream:要设置缓冲区的文件流。 |
缓冲模式 | 对应字符 |
---|---|
无缓冲_IONBF |
0 或 NULL |
行缓冲_IOLBF |
1 |
全缓冲_IOFBF |
2 |
返回值:
1 | 成功:返回0。 |
opean
1 | int open(const char *pathname, int flags, mode_t mode); |
参数:
1 | pathname: |
返回值:
1 | 成功:返回一个非负整数,表示打开的文件描述符。 |
opeanat
1 | int openat(int dirfd, const char *pathname, int flags); |
参数:
1 | int dirfd |
dirfd
参数的宏定义
宏定义 | 数值 | 含义 |
---|---|---|
AT_FDCWD |
-100 | 当前工作目录。 |
flags
参数的宏定义
宏定义 | 数值 | 含义 |
---|---|---|
O_RDONLY |
0 | 以只读方式打开文件。 |
O_WRONLY |
1 | 以只写方式打开文件。 |
O_RDWR |
2 | 以读写方式打开文件。 |
O_CREAT |
64 | 如果文件不存在,则创建新文件。 |
O_TRUNC |
512 | 如果文件已存在,则将其长度截断为 0。 |
O_APPEND |
1024 | 写操作时,数据会被追加到文件末尾。 |
O_EXCL |
2048 | 与 一起使用,确保如果文件已存在,则调用失败。 |
O_DIRECTORY |
65536 | 要求 是一个目录,否则调用失败。 |
mode
参数的权限位
宏定义 | 数值 | 含义 |
---|---|---|
S_IRUSR |
04000400 | 文件所有者具有读权限。文件所有者具有读权限。 |
S_IWUSR |
0200 | 文件所有者具有写权限。 |
S_IXUSR |
0100 | 文件所有者具有执行权限。 |
S_IRGRP |
0040 | 所属组具有读权限。 |
S_IWGRP |
0020 | 所属组具有写权限。 |
S_IXGRP |
0010 | 所属组具有执行权限。 |
S_IROTH |
0004 | 其他用户具有读权限。 |
S_IWOTH |
0002 | 其他用户具有写权限。 |
S_IXOTH |
0001 | 其他用户具有执行权限。 |
返回值:
1 | 成功:返回一个非负整数,表示打开的文件描述符。 |
close
1 | int close(int fd); |
close
函数用于关闭一个打开的文件描述符。它释放与文件描述符关联的系统资源。
参数 | 含义 |
---|---|
fd |
要关闭的文件描述符。 |
系统调用:
64位
1 | eax --> 6 |
32位
1 | rax --> 3 |
返回值
1 | 成功:返回 0。 |
read
1 | ssize_t read(int fd, void *buf, size_t count); |
参数:
1 | fd(文件描述符): |
64位
寄存器传参
1 | rdi --> fd |
系统调用
1 | rax --> 0 |
32位
栈传参
1 | 0x7FFFFFFF: 返回地址 |
系统调用
1 | eax --> 3 |
payload = b'a'*(0x30+4)+p32(read)+p32(fd)+p32(buf)+p32(count)
返回值:
1 | 成功: |
小tips:当沙箱规定read的文件描述符必须为零时,我们想要打orw得先关闭标准输入流也就是调用close(0)
关闭后即使read的fd参数是0也会被重定向到opean打开的文件中。
write
1 | ssize_t write(int fd, const void *buf, size_t count); |
参数 | 含义 |
---|---|
fd |
要写入的文件描述符。 |
buf |
指向要写入的数据的缓冲区。 |
count |
要写入的字节数。 |
流 | 文件描述符 |
---|---|
stdio 标准输入流 |
0 |
stdout 标准输出流 |
1 |
stderr 标准错误流 |
2 |
系统调用:
64位:
1 | rax --> 1 |
32位:
1 | eax --> 4 |
返回值
1 | 成功:返回实际写入的字节数。 |
fgets
1 | char *fgets(char *str, int n, FILE *stream); |
截断条件:输入字符达到n-1个包括换行符,或输入字符小于n-1检测到换行符停止获取输入并将换行符也读入。
参数
1 | str:指向存储读取内容的字符数组的指针。 |
返回值
1 | 成功:返回指向 str 的指针。 |
memcpy
1 | void *memcpy(void *dest, const void *src, size_t n); |
参数:
1 | dest: 目标内存地址,数据将被复制到这里 |
返回值
返回目标内存地址dest
mprotect
1 | int mprotect(const void* start,size_t len,int prot); |
mprotect
函数把自start开始的、长度为len的内存区的保护属性修改为prot指定的值
参数:
1 | start:是指向需要进行操作的地址 |
区间开始的地址start必须是一个内存页的起始地址(地址的后三位为0,0x1000=4096u),指定的内存区间必须包含整个内存页(4KB=4096B)
区间长度len必须是页大小的整数倍。
prot可以取一下几个值,并且可以用”|”将几个属性合起来使用:
- PROT_READ:表示内存段内的内容可写;
- PROT_WRITE:表示内存段内的内容可读;
- PROT_EXEC:表示内存段中的内容可执行;
- PROT_NONE:表示内存段中的内容根本没法访问;
- prot=7 是可读、可写、可执行7=1+2+4(r:4 w:2 x:1)
返回值:0;成功,-1;失败
mmap
1 | void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); |
buf = mmap(0LL, 0x1000uLL, 7, 34, -1, 0LL);
是一个典型的 mmap 调用,用于创建一个可以读、写和执行的内存映射区域,并将返回的地址赋值给变量 buf
参数解析:
1 | 1.addr : |
返回值:
1 | • 如果成功,mmap 返回 0 。 |
munmap
1 | int munmap(void *addr, size_t length); |
用于撤销mmap分配的内存映射区域
1 | 1. addr : |
返回值
1 | • 如果成功,munmap 返回 0 。 |
atoi
1 | int atoi(const char *str); |
str指向一个以空字符\0
结尾的串
atoi 的作用是将字符串 str 转换为一个整数。它会从字符串的开头开始解析,直到遇到第一个非数字字符(包括正负号和数字)为止。如果字符串以非数字字符开头,则返回值为 0 。