advanced heap exploiatior(搬运)
在学习chunk extended的是时候google到的,就果断搬运过来了
多图预警
搬运自https://www.slideshare.net/AngelBoy1/advanced-heap-exploitaion
advancede heap exploiator
环境
- glibc-2.19
- kernel-4.2
- 64bit
目录
- Fastbin corruption
- Shrink the chunk
- Extend the chunk
Fastbin corruption
假设程序有double free的漏洞
- 目的
- 我们可以利用fastin chunk改掉fd使得下下次malloc该chunk时可以取得自己想要的位置
- 为了利用double free的楼哦对那个来改比那fee chunk中的fd,我们可以利用一些fastbin的特性达到我们的目的,但我们也必须通过一些chunk的检查
fastbin的检查
in free(p):
- chunk address <-size 且alignment
- chunk size > =MINSIZE(0X20)且为0x10的倍数
- nextchunk-> size
- 大于MINSIZE(0X20)
- 小于system_mem(0x21000)
检查属于该size的fastbin中的第一块chunk与p是否不同
in malloc(bytes):
- 根据size大小取得index之后,到对应的fastbin中找,取出后检查该chunk的(unsigned lond)size事发后属于该fastbin
- 但实际比较的时候是先以fastbin中第一块size取得fastbin的index,再去用这个index跟刚刚算的Index是否想用,不过这取index的方式是用unsigned in(4 byte)
fast bin
- 一个单链表
- chunk size<=0x80 byte
- 不取消inuse flag
- 依据bin中所存的chunk大小.再分为10个fastbin 分别为0x20,0x30…
LIFO
当下次malloc大小与这次free大小相同时,会从相同的bin取出,也就是会取到相同位置的chunk
fastbin layout
布局我就不多阐述了,之前的文章有写过很多次
利用
- 我们可以利用fastbin的chunk再free的时候只检查属于该size的fastbin中的第一块chunk与p是否不同的特性来创造overlaps chunk
- 创造一个circle的singly linked list,这样就可以达到类似UAF的效果
- fd只要符和size是或否属于该chunk就可以通过Malloc检测,因此只要想写入的位置附近有属于该bin的size就可以让malloc分配到该位置
- 根据bytes大小取得index后,到对应的fastbin找,取出后检查该chunk的size事发后属于该fastbin
- 但实际比较的时候先是以fatbin中第一块size取得fastbin的index,再去比index和刚刚算的index是否相同,不过这取index的方式是哟个unsigned int(4byte),所以伪造是不用满足8byte
- 因此没有检查alognment所以不一定要以8的倍数作为chunk的address
Shrink the chunk
前提
假设存在一个和off-by-one的漏洞
目的
创造出overlap chunk,进而更改其他chunk中的内容
方法
主要利用Unsortedbin ,small bin会Unlink做合并的特性来达到我们的目的
过程(看图食用最佳)
- 一开始先malloc 3 块chunk(A,B,C)到heap段,且fastbin是空的
- free(B)
- free(A)
- malloc(0x38)
- 往A中写数据触发off-by-one来覆盖size
- malloc(0x80)
- malloc(0x30)
- free(B)
- free(C)
此时会因为C是SMALL BIN的大小的缘故,所以会检测上一块是否inused
如果上一块是freed就会根据prev_size去找上一块chunk的header做合并及unlink
此时unsortbin村这块大的chunk,所以下次malloc会用这一块先分配给user - malloc(0x260)
此时即可任意修改D
总结
- 如果中间overlap部分有function pointer或者是其他有用的struct可简介控制程序流程
- 也可以配合fastbin freed chunk更改fd
extend the chunk
前提
假设存在一个off-by-one的漏洞
目的
造出overlap chunk,进而更改其他chunk中的内容
原理
跟shrink很像,但主要是加大size直接覆盖后面的chunk,只要前面的 chunk header有对上的就行
过程(配合图食用最佳)
- 一开始先malloc 3 块chunk 到heap段
- free(A)
- malloc(0x38)
- 往A中写数据以构造off-by-one
- free(B)
0x1b1=0x171+0x40
为了之后可以覆盖c(把c吃进去) - 此时会根据B的size去找下一块chunk的hader
- 此时这块chunk会被合并到top(如果c后面是top)或者加入到unsortbin中
- malloc(0x1a0)
- 此时可以任意更改c
总结
和shrink比起来extend the chunk的限制多了一些,必须要可控off-by-one的那个byte,Shrink只要是null byte即可,相对比较常见但是也不太好发现
大总结
堆的漏洞利用起来虽然会难一点,但是常常在Full mitigation的情况下都可以利用,毕竟针对heap来说相对应的保护比较少,也较难实现
Heap是门艺术(真的是门艺术…爆肝调试就完了
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!