今天第四天啦,继续加油orz。这几天先把几种基本的堆的利用方式学学吧。
参考资料
Fastbin Attack是基于fastbin的一类漏洞利用的方法,这些利用有一些前提:
- 有堆溢出,uaf等漏洞,可以控制chunk内容
- 漏洞发生在fastbin类型的chunk之中
漏洞主要原理在于Fastbin是通过单链表管理的,并且释放fastbin的chunk的时候不会清空next chunk的pre_in_use位。
Fastbin Double Free
Fastbin Double Free是指fastbin的chunk可以被多次释放,导致同一个chunk可以在fastbin链表中多次存在。这样分配的时候就可以实现多个指针指向同一个堆块,这样,根据不同指针对于堆块内容的用处不用,就能实现类型混淆的效果
这个方法可以成功有两个原因:
- 堆块被释放后没用清空next chunk的pre_in_use位
- fastbin在进行free的时候只检查main_arena直接指向的块,对于之后的块并没有检查。
1 | int main(void) |
free(chunk1)
1 | +--------------+ +----------+ |
free(chunk2)
1 | +--------------+ +----------+ +----------+ |
free(chunk3)
1 | +--------------+ +----------+ +----------+ +----------+ |
这样free在第三次释放后fd的值不为0而是指向chunk2
如果在这时,我们能够控制chunk1的内容,就可以改写fd从而在我们想要的的地址分配fastbin块(要注意大小必须和该fastbin链表的大小一致)。从而实现任意地址写。
House Of Spirit
这个就是通过控制目标区域前后的内容,伪造一个假的chunk,然后将这块内存释放掉,再分配回来,就能控制目标区域的内容了。
要注意一些检测
- fake chunk的ISMMAP位不能位1,因为会被特殊处理
- fake chunk的地址要对齐,MALLOC_ALIGN_MASK
- fake chunk的大小要满足对应fastbin的需求
- fake chunk的next chunk大小不能小于
2*SIZE_SZ
,同时也不能大于av->system_mem
- fake chunk对用的fastbin链表头部不能使该fake chunk(不能double free)
具体利用之前写过了,下次复习orz
Alloc to Stack
这个比较好理解
通过在栈上伪造fake chunk,然后通过修改在fastbin链表中的chunk的fd指针指向fake chunk,就能把栈上的fake chunk分配出来,然后控制一些关键数据。注意栈上的fakechunk需要又满足条件的size值。
Arbitrary Alloc
这个跟上一个一样,只是不局限在栈上,任何满足条件的size域,都可以成为被分配的块。
可以使用字节错位来寻找满足条件的size,然后在fastbin构造一个相同组的chunk,通过修改该chunk的fd,就能分配到该目标块了。
栗子
Search Engine
首先康康保护
1 | checksec search |