堆利用之fastbin attack
三种典型的可以利用fastbin attack的漏洞
1.double free
当程序有double free漏洞时,可以通过申请两个fastbin大小的堆块1和2,以0x30举例,然后分别释放chunk1和chunk2,fastbin的结构如下图
这时由于有double free漏洞,再释放chunk 1,链表就会变成这样一个循环链表:
表头指向chunk1,chunk1指向chunk2,chunk2又指回chunk1。那么这时按照如下步骤:
申请一个new chunk 1:
将new chunk 1中的内容修改为要修改的地址(-0x10以上):
申请一个new chunk 2:
- 再申请一个new chunk 3(new chunk 3是和new chunk 1重合的)
这时可以发现,fastbin链表已经指向了我们想要修改的地址了,只要再申请一个堆块就会申请到想要修改的地址,然后只要编辑这个堆块便可完成任意地址写。
总结:总的来说要利用double free的漏洞就是要有两个指针指向同一个chunk,这样就可以利用一个指针对chunk的内容做修改,另外一个指针(也就是fastbin的表头)指向该chunk时就会认为其中内容为fd(也就是下一个堆块的地址,但是该地址是我们认为修改的),我们再申请chunk那么fastbin表头就会指向我们填充的那个地址,这样也就等于是生成了一个假的chunk。
2.chunk extend
chunk extend是一种限制比较少的堆利用方式,通常通过off by one或off by null或者其他堆溢出来利用。
chuank extend利用需要的条件是:
- 可以进行堆布局
- 可以溢出至少一个字节
chunk extend的原理是,首先申请三个堆块:
这里size 0x18是堆块的大小,1是前一个堆块占用位,先通过编辑堆块A然后通过off by one来溢出到堆块B的size域,并将其修改为0x18+0x18+1(其实就是size B+size C,然后前一个堆块占用1):
这时释放堆块B,由于大小在fastbins中,所以(堆块C的)下一个堆块的前一个堆块使用位不会被置0,再释放C,arena中对应的bins就会指向B和C,如图:
然后再申请一个大小为0x20的堆块,将C申请回来,这时bins就会指向freegot,接下来再申请空间就会申请到freegot了:
再次申请一个0x20大小的堆块就会申请到free_got所在的地方,这时就可以修改为任意的值了。
总结:该方法利用堆溢出的方法来修改下一个堆的size位使得下一个chunk的大小可以覆盖下下个chunk,然后在其中写入内容,从而达到可以污染下下个chunk的fd位的目的。总得来说与double free非常类似最后同样是让两个指针指向同一个chunk,一个指针申请回来使我们可以修改chunk中的内容(任意地址),让fastbin可以指向我们所写的任意地址。
3.use after free
use after free来利用fastbin attack也非常简单。首先,申请一个对应fastbin区间内的堆块并释放:
接着利用use after free将这个已释放堆块的指针域修改,修改为想要修改的地址:
然后和double free的后半段类似,再申请两个堆块便可申请到想要修改的地址处,之后编辑即可。
总结:UAF的原理也就是在申请堆然后释放该堆但是却没有把指向该堆的指针置零,导致出现浮空指针,很容易的就出现了两个指针指向同一个堆的情况