CTF-PWN
常见的危险函数
gets() 没有检查边界
- 通过计算函数的偏移量,通过构造payload达到溢出
fgets(buf, 40, stdin)
- 能够接受39Byte,最后一个字节为NULL
- 如果buf的长度没有39也可以造成溢出
read(stdin, buf, 40)
- 从输入中读取40个Byte,到buf,最后的字节可以不是NULL
可能会造成信息的泄漏
read(0,buf,0x20) 从用户输入读取32个字符
Write(int fd, buf, nbytes)
- fd 输出描述 1
- buf 为要写入到数据的缓冲区地址
- nbytes为要写入的数据的字节数
strcpy
memcpy
scanf(“%s”,buff)
syscall系统调用
操作系统实现系统调用的基本过程是:
- 应用程序调用库函数(API)
- API将系统调用号存入EAX,然后通过中断调用使系统进入内核态
- 内核中终端处理函数根据系统调用号,调用对应的内核函数(系统调用)
- 系统调用完成相应的功能,将返回值存入EAX,返回到中断处理函数
- 中断处理函数返回到API中
- API将EAX返回给应用程序
应用程序调用系统调用的过程
- 把系统调用的编号存入EAX
- 把函数参数存入其他通用寄存器
- 触发0x80号中断(int 0x80)
以上是32位的系统调用,与64 位的区别是
传参方式不同
- 32位
- 先将系统调用号传入eax,然后将参数从左到右依次存入ebx,ecx,edx寄存器中,返回值存在eax中
- 64位
- 先将系统调用号传入rax,然后传参数 从左到右依次存入rdi,rsi,rdx寄存器中,返回值存在rax寄存器
- 32位
系统调用号不同
- 32位
- sys_read 的系统调用号为 30 sys_write 的系统调用号为4
- 64位
- sys_read的调用号位0,sys_write的调用号为1亿
- 32位
调用方式不同
- 32位
- 使用int 80 中断进行系统调用
- 64位
- 使用syscall进行系统调用
- 32位