memory safety vulnerabilities

stack

stack overflow

不安全的输入函数会导致栈上的内容被覆盖,如果栈的返回地址被覆盖,会导致控制流转移到不合适的地方.

format string vulnerability

printf()通过格式化字符串来推断参数的个数,可以通过这个特性来将栈上的内容打印出来,例如,如果栈上存在一个密钥key,可以通过各种办法将key打印出来(请思考,具体的场景是什么?).

integer conversion vulnerabilities

一码胜千言:

  char buf[8];
  void vulnerable() {
      int len = read_int_from_network();
      char *p = read_string_from_network();
      if (len > 8) {  /* 1 */
          error("length too large: bad dog, no cookie for you!");
          return;
      }
      memcpy(buf, p, len);  /* 2 */
  }

在1处,如果 len 为-1,不会进入 if 分支,也就是说会执行 memcpy , memcpy 的第三个参数是 size_t 类型,在大部分系统上, size_t 其实是 unsigned int , len 为-1时,转换成 unsigned int 就是最大的无符号数,所以这个 memcpy 调用会将很长的数据从 p 中复制到 buf 中,这时就出现了buffer溢出.

another case:

void vulnerable() {
    size_t len;
    char *buf;

    len = read_int_from_network();
    buf = malloc(len+5);
    read(fd, buf, len);
    ...
}

请思考,当 len-1= 时,将会发生什么?

off-by-one vulnerabilities

中文是差一漏洞,一个比较常见的场景是,通过这个漏洞,可以向缓冲区+1的位置写入数据,这个位置很有可能是caller的 ebp ,这样的话,可以让 caller 返回的时候栈上的 eip 变成任意值,从而操作控制流的转移.

详细信息请参考textbook 3.5节,这本书写得太好了.

heap

heap overflow

C++的vtable指针漏洞.

C++中为对象分配的动态内存在堆中,且一个对象的最低8个字节内存为虚表的指针,如果两个连续的C++对象,且地址较低的内存

use-after-free

攻击者释放的漏洞被分配给了受害者,但是攻击者仍然持有指针,就好像攻击者和受害者共享一块内存.

other

danling pointer

double free

防御措施

stack canary

pointer authentication

address space layout randomization(ASLR)