这篇文章用于记录函数的详细信息

c

setbuf

setbuf 函数用于设置文件流的缓冲区。它允许你指定一个用户提供的缓冲区,用于文件的输入输出操作

1
void setbuf(FILE *stream, char *buf);

setbuf只有全缓冲或无缓冲

参数 含义
stream 要设置缓冲区的文件流。
buf 用户提供的缓冲区。如果 bufNULL,则禁用缓冲。
文件流 含义
stdio 标准输入流
stdout 标准输出流
stderr 标准错误流
缓冲模式 对应字符
无缓冲_IONBF 0NULL
全缓冲_IOFBF 2

setvbuf

1
int setvbuf(FILE *stream, char *buf, int mode, size_t size);

参数:

1
2
3
4
5
6
7
stream:要设置缓冲区的文件流。
buf:用户提供的缓冲区。如果为 NULL,则使用系统分配的缓冲区。
mode:缓冲类型,可以是以下值:
_IOFBF:全缓冲。
_IOLBF:行缓冲。
_IONBF:无缓冲。
size:缓冲区大小。
缓冲模式 对应字符
无缓冲_IONBF 0NULL
行缓冲_IOLBF 1
全缓冲_IOFBF 2

返回值

1
2
成功:返回0。
失败:返回非零值(通常为 -1)。

opean

1
int open(const char *pathname, int flags, mode_t mode);

参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
pathname:
指向一个以空字符结尾的字符串,表示要打开的文件或设备的路径名。
路径可以是绝对路径(如 /home/user/file.txt)或相对路径(如 ./file.txt)

flags:
一个整数,表示打开文件的方式。flags 参数必须包含以下几种模式之一:
0 --> O_RDONLY:只读模式。
1 --> O_WRONLY:只写模式。
2 --> O_RDWR:读写模式。
除了上述基本模式外,还可以结合其他标志使用,通过按位或操作(|)组合:
O_CREAT:如果文件不存在,则创建一个新文件。
O_TRUNC:如果文件已存在且以写模式打开,则将文件长度截断为 0。
O_APPEND:写入时将数据追加到文件末尾。
O_EXCL:与 O_CREAT 一起使用,如果文件已存在,则返回错误。
O_NONBLOCK:非阻塞模式,适用于设备文件或套接字。
O_NOCTTY:如果路径名指向终端设备,不将其作为控制终端。
O_DIRECTORY:要求路径名必须是一个目录。

mode:
仅在 flags 中包含 O_CREAT 时使用,指定文件的权限模式。
权限模式使用符号常量(如 S_IRUSR、S_IWUSR 等)定义,通常用八进制表示(如 0644)。
如果未指定 O_CREAT,则 mode 参数被忽略。

返回值:

1
2
成功:返回一个非负整数,表示打开的文件描述符。
失败:返回 -1,并设置 errno 以指示错误原因。

opeanat

1
2
int openat(int dirfd, const char *pathname, int flags);
int openat(int dirfd, const char *pathname, int flags, mode_t mode);

参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int dirfd
• 含义:目录文件描述符,指定 pathname 的解析起点。
• 常见值:
AT_FDCWD:当前工作目录(与 open 函数类似)。
• 有效文件描述符:指向一个目录的文件描述符。
• 用途:用于指定 pathname 的上下文目录。

const char *pathname
• 含义:文件路径名。
• 行为:
如果 dirfd 是 AT_FDCWD,则 pathname 是相对于当前工作目录的路径。
如果 dirfd 是一个有效的目录文件描述符,则 pathname 是相对于该目录的路径。
如果 pathname 是绝对路径(以 / 开头),则 dirfd 被忽略。

int flags
• 含义:文件打开模式标志,与 open 函数的 flags 参数相同。
• 常用标志:
O_RDONLY:只读模式。
O_WRONLY:只写模式。
O_RDWR:读写模式。
O_CREAT:如果文件不存在,则创建新文件。
O_TRUNC:如果文件已存在,则清空文件。
O_APPEND:写操作时追加到文件末尾。
O_EXCL:与 O_CREAT 一起使用,确保文件不存在。

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
2
成功:返回一个非负整数,表示打开的文件描述符。
失败:返回 -1,并设置 errno 以指示错误原因。

close

1
int close(int fd);

close函数用于关闭一个打开的文件描述符。它释放与文件描述符关联的系统资源。

参数 含义
fd 要关闭的文件描述符。

系统调用:

64位

1
2
eax  -->  6
ebx --> fd

32位

1
2
rax  -->  3
rdi --> fd

返回值

1
2
成功:返回 0。
失败:返回 -1,并设置 errno 以指示错误原因。

read

1
ssize_t read(int fd, void *buf, size_t count);

参数:

1
2
3
4
5
6
7
8
9
10
11
12
fd(文件描述符):
• 一个非负整数,表示要从中读取数据的文件或设备。
• 文件描述符通常通过系统调用(如open、pipe 、socket等)获得。
• 标准输入(stdin)的文件描述符是 0

buf(缓冲区):
• 一个指向存储读取数据的内存区域的指针。
• 读取的数据将被存储在这个缓冲区中。

count(读取字节数):
• 指定最多要读取的字节数。
• 实际读取的字节数可能少于count,具体取决于文件的内容和当前的读取位置。

64位

寄存器传参

1
2
3
rdi  -->  fd
rsi --> *buf
rdx --> count

系统调用

1
2
3
4
5
rax  -->  0
rdi --> fd
rsi --> *buf
rdx --> count
syscall

32位

栈传参

1
2
3
4
0x7FFFFFFF: 返回地址
0x7FFFFFFC: 3 (fd)
0x7FFFFFF8: 0x12345678 (buf)
0x7FFFFFF4: 10 (count)

系统调用

1
2
3
4
5
eax  -->  3
ebx --> fd
ecx --> *buf
edx --> count
int 80

payload = b'a'*(0x30+4)+p32(read)+p32(fd)+p32(buf)+p32(count)

返回值:

1
2
3
4
5
6
成功:
返回实际读取字节数
如果返回值大于 0,表示成功读取了指定数量的字节(或部分字节,如果文件末尾或设备限制)。
如果返回值为 0,表示已到达文件末尾(EOF)。
失败:
返回值:返回 -1,并设置 errno 以指示错误原因。

小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
2
3
4
rax  -->  1
rdi --> fd
rsi --> buf
rdx --> count

32位:

1
2
3
4
eax  -->  4
ebx --> fd
ecx --> buf
edx --> count

返回值

1
2
成功:返回实际写入的字节数。
失败:返回 -1,并设置 errno 以指示错误原因。

fgets

1
char *fgets(char *str, int n, FILE *stream);

截断条件:输入字符达到n-1个包括换行符,或输入字符小于n-1检测到换行符停止获取输入并将换行符也读入。

参数

1
2
3
str:指向存储读取内容的字符数组的指针。
n:指定最多读取的字符数(包括字符串末尾的空字符 \0)。
stream:指向输入流的指针(如 stdin 表示标准输入,FILE *file 表示文件流)。

返回值

1
2
成功:返回指向 str 的指针。
失败或文件结束:返回 NULL。

memcpy

1
void *memcpy(void *dest, const void *src, size_t n);

参数:

1
2
3
dest: 目标内存地址,数据将被复制到这里
src:源内存地址,数据将从这里被复制
n:要复制的字节数

返回值

返回目标内存地址dest

mprotect

1
int mprotect(const void* start,size_t len,int prot);

mprotect函数把自start开始的、长度为len的内存区的保护属性修改为prot指定的值

参数:

1
2
3
start:是指向需要进行操作的地址
len:是地址往后多大的长度
port:是要赋予的权限

区间开始的地址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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
1.addr  :
• 类型: void *
• 值: 0LL (即0)
• 含义:建议的映射地址。如果设置为 NULL 或 0 ,操作系统会选择一个合适的地址进行映射。这通常是推荐的做法,除非你需要特定的地址。
2.length :
• 类型: size_t
• 值: 0x1000uLL (即4096)
• 含义:映射区域的大小,以字节为单位。这里映射了 4096 字节,通常是一个内存页面大小。
3. prot :
• 类型: int
• 值: 7
• 含义:指定映射区域的保护属性。7 是 PROT_READ | PROT_WRITE | PROT_EXEC 的组合,表示映射区域可以读、写和执行。
4. flags :
• 类型: int
• 值: 34
• 含义:指定映射的类型和行为。 34 是 MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED 的组合:
MAP_PRIVATE :映射是私有的,对映射区域的修改不会反映到文件中。
MAP_ANONYMOUS :映射区域不与任何文件关联,通常用于分配匿名内存。
MAP_FIXED :强制使用指定的地址 addr 进行映射。如果 addr 不为 0 ,操作系统会尝试在该地址创建映射。如果该地址已经被占用或不可用,mmap 会失败。
5. fd :
• 类型: int
• 值: -1
• 含义:文件描述符。对于 MAP_ANONYMOUS 映射,fd 必须设置为 -1 ,表示不与任何文件关联。
6. offset :
• 类型: off_t
• 值: 0LL (即 0 )
• 含义:文件偏移量。对于匿名映射,这个参数通常设置为 0 。

返回值:

1
2
• 如果成功,mmap 返回 0 。
• 如果失败,mmap 返回 -1 ,并设置 errno 以指示错误原因。

munmap

1
int munmap(void *addr, size_t length);

用于撤销mmap分配的内存映射区域

1
2
3
4
5
6
1.   addr  :
• 指向要撤销映射的内存区域的起始地址。
• 这个地址必须是之前通过 mmap 调用返回的地址。
2. length :
• 要撤销映射的内存区域的大小(以字节为单位)。
• 这个大小必须是页面大小的整数倍(通常为 4KB 或 2MB,具体取决于系统配置)。

返回值

1
2
• 如果成功,munmap 返回 0 。
• 如果失败,munmap 返回 -1 ,并设置 errno 以指示错误原因。

atoi

1
int atoi(const char *str);

str指向一个以空字符\0结尾的串

atoi 的作用是将字符串 str 转换为一个整数。它会从字符串的开头开始解析,直到遇到第一个非数字字符(包括正负号和数字)为止。如果字符串以非数字字符开头,则返回值为 0 。