PWN入门之 OFF-BY-ONE 堆漏洞的利用

1.of-by-one 的分类:

off-by-one总共可以分为两种利用方式

chunk overlapping

off-by-one overwrite allocated

off-by-one overwrite freed

off-by-one null byte

unlink

off-by-one small bin

off-by-one large bin

这种划分的依据是基于利用的思路不同。

第一种的利用的核心思路主要是为了进行chunk overlapping,而第二种的利用思路则是想要触发unlink。

2.off-by-one的利用条件:

off-by-one并不是全都可以达到利用的目的的。首先就要求堆必须以要求的size+0x4字节(x86)的大小进行分配。如果不满足这个条件那么就无法覆盖到inuse位了。这个是由于堆的字节对齐机制造成的,简单的说堆块是以8字节进行对齐的(x64为16字节)。如果malloc(1024),那么实际会分配1024+8=1032字节,这一点很好理解。但是如果是malloc(1020)呢,1020+8=1028字节,而1028不满足8字节对齐,那么实际只会分配1020+4=1024字节,多出的4个字节由下一块的prev_size提供空间。

而对于触发unlink的操作来说,还需要一个额外的附加条件。因为现在的unlink是有检验的,所以需要一个指向堆上的指针才可以。

3.off-by-one漏洞利用效果:

off-by-one能达到什么利用效果呢?这个是很关键的问题。根据分类来看可以实现两种效果

1.chunk overlapping

所谓的chunk overlapping是指,针对一个目标堆块。我们可以通过一些操作,使这个目标堆块被我们重新分配到某个我们控制的新的堆块中,这样就可以对目标堆块进行任意的读写了。

2.unlink

这种off-by-one造成的unlink的利用效果其实和溢出造成的unlink的利用效果是一致的。对于small bin可以使指向堆的指针ptr的值变为&ptr-0xc,这样再结合一系列的操作就可以达成几乎无限次的write-anything-anywhere了。

而large bin的unlink则可以实现一次任意地址写(write-anything-anywhere)。

 4.关于漏洞利用原理:

chunk overlapping的原理在于ptmalloc的堆块验证机制的不完善,通过一些ptmalloc定义的宏就可以看出这一点。

inuse():仅通过下一块的inuse位来判定当前块是否使用.

prev_chunk():如果前一个块为空,那么进行空块合并时,仅使用本块的prev_size来寻找前块的头。

next_chunk():仅通过本块头+本块大小的方式来寻找下一块的头

chunksize():仅通过本块的size确定本块的大小。

unlink的原理在于unlink宏在处理时会互写数据造成任意地址写。经过改进后的unlink宏增加了check,但是可以通过一个指向堆上的指针导致绕过情况。

5.关于漏洞利用的基本要求:

https://blog.csdn.net/nibiru_holmes/article/details/62040763

posted @ 2018-11-23 08:25  answ0r  阅读(380)  评论(0编辑  收藏  举报