House of Rabbit
是一种主要利用 fastbin attack
来实现攻击的方法。原作者提供的 POC
我分析了一下感觉需要满足的条件挺多,而且要求也挺复杂。感觉没有Wiki
上讲的本质,所以本文主要参考Wiki。
原理
fastbin
中会把相同大小的size
的堆块用一个单向链表管理,分配的时候会检查size
是否合理。但是,仅考虑 glibc 2.26
版本以下,当分配一个超大块时,会执行 malloc_consolidate
,将fastbin
中的堆块进行合并,而此时却没有对堆块的size
进行检查。
堆块合并的触发代码如下:
1 |
|
在 malloc_consolidate()
中,会循环处理各 fastbin
堆块,当堆块与top
相邻时,与top
合并。否则,将堆块放入unsortedbin
中,并设置 Pre_size
和pre_inuse
位:
1 | if (nextchunk != av->top) { |
条件
- 可以修改
fastbin
的fd
指针或size
; - 可以触发
malloc_consolidate(merge top 或 malloc big chunk等)
POC
1 | /* |
POC
中主要分以下几步:
- 填充
0x20
和0x90
的tcache
,是为了将后续释放堆块放到fatsbin
中 - 连续两次分配释放
0xa00000
的大块,是为了扩大top chunk
的大小; - 分别申请一个
0x20
的fastbin
和一个0x90
的smallbin
,并释放0x20
的chunk
到fastbin
中; - 然后再
bss
中伪造一组size
,其中第一个fake_chunk
的prev_size
为0xfffffffffffffff0
,这样是保证整数溢出,当前fake_chunk_addr
加上这个size
,其实是会向上溢出。
1 | fake_chunk2: |
- 修改
0x20
的fastbin
的fd
指向fake_chunk1
,此时达成了house of rabbit
的触发条件 - 首先释放
smallbin
,此时由于和top chunk
会与其合并,此时就只有fake_chunk
进入了unsortedbi
- 将
fake_chunk
仅仅放入unsortedbin
是不够的,还需要将其放入largebin
中。 申请大于0xffff
的大块,会将fake_chunk
放入largebin
中,不过之前得修改fake_chunk
得size
为0xa0000
1,其目的有两个,1是绕过程序对unsorted bin
中内存块大小小于av->system_mem
的检测;2是使程序放入large bin
的最后一块(>0x800000
)
- 然后,再将
fake_chunk
的size
改为0xfffffffffffffff1
,然后再申请malloc((void*)&target-(void*)(gbuf+2)-0x20);
,此处的target
是我们想任意分配的地址。POC
中的target
地址比fake_chunk_addr
小,不过问题不大,这里相减会得到一个负数,但是Malloc
中是用unsigned int
来识别size
,此时会得到一个大数,但不超过fake_size
。申请的size+fake_chunk_addr
会直接溢出,导致得到的结果,刚好为我们的target_addr
。如下图所示:我们完成这个malloc
后,fake_chunk
剩余的remainder
是刚好指向target
地址
9. 经过上面的步骤,我们已经将fake_chunk
分配到了 target
地址了,后面就可以实现任意地址分配了。
示例
修改fastbin size
漏洞代码如下:(参考EX师傅)
1 |
|
首先申请两个0x20
大小的chunk
,释放他们,会进入fastbin
中:
然后修改了 0x602000
堆块的size
为 0x41
,然后申请一个 0x1000
的chunk
。此时发生堆块合并,由于 0x602000
的size
被修改为0x41
,会被合并进入 0x40
的smallbin
中。
此时,就已经发生了堆覆盖,我们只需申请 0x40
的chunk
,就能够完成堆覆盖。
修改fastbin fd
漏洞代码如下:
1 |
|
首先申请一个0x20
和0x100
的chunk
,然后在 0x100
chunk的内部从数据段伪造了一个fake chunk
,这里要注意伪造时,要保证fake chunk
的后面连续两个chunk
的size
的合法性。随后释放这两个chunk
,并修改0x20
fastbin的fd
指向fake chunk
:
随后,使用堆块合并,将0x20
的chunk
和 0x30
的fake chunk
都放入smallbin
:
2018 HITB mutepig
程序分析
程序漏洞很明显,Delete
函数存在一个 UAF
漏洞。
利用分析
模板和上面POC
的形式很相似,申请的堆块大小也都差不多。直接套POC
模板就行。
EXP
1 | from pwn import * |
参考
- 本文作者: A1ex
- 本文链接: http://yoursite.com/2020/10/15/House-of-Rabbit学习/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!