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位
          • sys_read 的系统调用号为 30 sys_write 的系统调用号为4
        • 64位
          • sys_read的调用号位0,sys_write的调用号为1亿
      • 调用方式不同

        • ​ 32位
          • 使用int 80 中断进行系统调用
        • 64位
          • 使用syscall进行系统调用