fastbin dup consolidate
一个简单的fastbin dup consolidate U•ェ•*U
相关过程
malloc的过程中如果chunk属于large bin,那么会计算large bin的index并且调用malloc_consolidate整理fastbin
1 |
|
malloc_consolidate会整理fastbin中的chunk,能合并的合并然后放进unsorted bin。在之后的遍历unsorted bin的过程中又会把chunk放进small bin
由于free一个属于fastbin的chunk时不检查nextchunk的preinuse位,所以可以构造double free
利用
2.26以下
实验代码如下(来自how2heap):
1 |
|
(实验环境2.23)
- 第一次free(p1)
- malloc(0x400)触发malloc_consolidate
- 第二次free(p1)
2.26以上
需要先填满tcache,其他一样
例题Hitcon 2016 SleepyHolder
静态分析
针不戳~有源码
del函数没有检查是否已经del,可以double free
1 |
|
思路(fastbin_dup_consolidate+unlink)
这道题展示了fastbin_dup_consolidate的一个作用,就是可以在使用chunk时同时让nextchunk的preinuse位为0,辅助unlink
- 先add一个small secret再add一个big secret
- 对small secret进行fastbin dup consolidate
- 在small secret里布置fake chunk,然后delete big secret触发unlink
ps:这个时候如果使用gdb heap命令会很奇怪,top chunk没了 其实big secret和small secret里的fake chunk都收进top chunk里了,看fake chunk的大小就能看出来 或者看main_arena也能看出来,main_arena+88存的就是top chunk的地址 pss:之后的过程可能会有点绕o(TヘTo) - unlink结束后几个存secret的内存是这样的
1
2
3big_secret -> big_chunk
huge_secret -> huge_chunk
small_secret -> small_secret-0x18 - add small secret向small_secret-0x18写payload
1
2
3
4b'bbbbbbbb'
big_secret -> got['atoi'] -> atoi_addr
huge_secret -> got['atoi'] -> atoi_addr
small_secret -> got['free'] -> free_addr - update small secret向got[‘free’]写plt[‘puts’]
1
2
3
4b'bbbbbbbb'
big_secret -> got['atoi'] -> atoi_addr
huge_secret -> got['atoi'] -> atoi_addr
small_secret -> got['free'] -> plt['puts'] - 之后执行delete(big_secret)时实际执行的就是puts(got[‘atoi’]),此时atoi已经执行过所以got表里放的应该就是atoi的地址,减去偏移可以算出libc基址
- 再update small secret向got[‘free’]写system_addr
1
2
3
4b'bbbbbbbb'
big_secret -> got['atoi'] -> atoi_addr
huge_secret -> got['atoi'] -> atoi_addr
small_secret -> got['free'] -> system_addr - add big secret向got[‘atoi’]写b’/bin/sh\x00\x00’
1
2
3
4b'bbbbbbbb'
big_secret -> got['atoi'] -> b'/bin/sh\x00\x00'
huge_secret -> got['atoi'] -> atoi_addr
small_secret -> got['free'] -> system_addr - 再delete(big_secret)时实际执行的就是system(got[‘atoi’]),而got[‘atoi’]这时存的是b’/bin/sh\x00\x00’,实际执行的就是system(‘/bin/sh’)
exp
1 |
|
fastbin dup consolidate
http://akaieurus.github.io/2023/01/29/fastbin-dup-consolidate/