Off By One
漏洞
漏洞原理
严格来说 off-by-one
漏洞是一种特殊的溢出漏洞,off-by-one
指程序向缓冲区中写入时,写入的字节数超过了这个缓冲区本身所申请的字节数并且只越界了一个字节。
一般来说,单字节溢出被认为是难以利用的,但是因为 Linux 的堆管理机制 ptmalloc
验证的松散性,基于 Linux 堆的 off-by-one
漏洞利用起来并不复杂,并且威力强大。
利用思路
根据溢出的字节类型,可以分为以下两种情况:
- 溢出字节为任意可以控制的字节。通过修改大小造成块之间出现重叠,从而泄露或覆盖其他块的数据。
- 溢出字节为
NULL
字节。在size=0x100
时,溢出NULL
字节会使prev_in_use
位被清零:- 这时可以选择
unlink
方法进行处理(漏洞利用方式 unlink); - 另外
prev_size
域就会启用,伪造prev_size
可以造成块之间的重叠(glibc2.28
已经修复)。
- 这时可以选择
使用示例
Use After Free
漏洞
漏洞原理
Use After Free
即释放后重用,可以利用的漏洞主要分为以下两种情况:
- 内存块被释放后,其对应的指针没有被设置为 NULL ,在它下一次被使用之前,没有修改。
- 内存块被释放后,其对应的指针没有被设置为 NULL,但是在它下一次使用之前,有代码进行了修改。
此外,我们一般称被释放后没有被设置为 NULL 的内存指针为 dangling pointer。
如果报错内容出现 segment fault (core dumped)
一般就是这个情况导致的。