漏洞类型

Off By One 漏洞

漏洞原理

严格来说 off-by-one 漏洞是一种特殊的溢出漏洞,off-by-one 指程序向缓冲区中写入时,写入的字节数超过了这个缓冲区本身所申请的字节数并且只越界了一个字节。

一般来说,单字节溢出被认为是难以利用的,但是因为 Linux 的堆管理机制 ptmalloc 验证的松散性,基于 Linux 堆的 off-by-one 漏洞利用起来并不复杂,并且威力强大。

利用思路

根据溢出的字节类型,可以分为以下两种情况:

  1. 溢出字节为任意可以控制的字节。通过修改大小造成块之间出现重叠,从而泄露或覆盖其他块的数据。
  2. 溢出字节为 NULL 字节。在 size=0x100 时,溢出 NULL 字节会使 prev_in_use 位被清零:
    1. 这时可以选择 unlink 方法进行处理(漏洞利用方式 unlink);
    2. 另外 prev_size 域就会启用,伪造 prev_size 可以造成块之间的重叠(glibc2.28 已经修复)。

使用示例

Asis CTF 2016 b00ks

Use After Free 漏洞

漏洞原理

Use After Free 即释放后重用,可以利用的漏洞主要分为以下两种情况:

  • 内存块被释放后,其对应的指针没有被设置为 NULL ,在它下一次被使用之前,没有修改
  • 内存块被释放后,其对应的指针没有被设置为 NULL,但是在它下一次使用之前,有代码进行了修改

此外,我们一般称被释放后没有被设置为 NULL 的内存指针为 dangling pointer

如果报错内容出现 segment fault (core dumped) 一般就是这个情况导致的。

使用示例

Hitcon Traning lab10

Double Free 漏洞