basic skills
[TOC]
各个bin的大小
以下皆为chunk的大小: fastbin:0x20-0x80 smallbin:<=0x3f0 largebin:>=0x400 tcache:0x20-0x410
unlink
- unlink 的目的是把一个双向链表中的空闲块拿出来(例如 free 时和目前物理相邻的 free chunk 进行合并)比如当前Q是使用中的一个chunk,P是Q的prev chunk或者next chunk,如果free(Q),那么在堆空间上P,Q相邻且都被free,要合并这两个chunk,首先要先把P从bin中取出来,因此进行了unlink,unlink是对P进行的操作。
- unlink要绕过的检查,检查有个缺陷,就是 fd/bk 指针都是通过与 chunk 头部的相对地址来查找的
off-by-one/off-by-null
- 当chunk大小<0x80的时候会直接进入tcache,不会参与unlink
- unlink之后的overlapping chunk都会进入unsorted bin,不论其大小
uaf
- 条件:在free掉一块内存后,没有将其置为NULL,紧接着申请大小相同的内存,操作系统会将刚刚free掉的内存再次分配。(为了更高的分配效率)
- glibc 堆分配的策略为first-fit。在分配内存时,malloc 会先到 unsorted bin(或者fastbins) 中查找适合的被 free 的 chunk,如果没有,就会把 unsorted bin 中的所有 chunk 分别放入到所属的 bins 中,然后再去这些 bins 里去找合适的 chunk。
chunk extend and overlapping
- chunk extend 就是通过控制 size 和 prev_size 域来实现跨越块操作从而导致 overlapping 的
- 漏洞利用条件:漏洞可以控制 chunk header 中的数据(所以经常会结合off-by-one一起用)
- 漏洞作用:一般来说,这种技术并不能直接控制程序的执行流程,但是可以控制 chunk 中的内容。
- 利用方法:后向overlapping:一般都是通过修改该chunk的size字段,再将其free,free的时候就对next chunk进行了overlapping。如果再malloc合适大小,就可以得到extend后的chunk,通过edit函数进行控制。而且如果extend后是small bin的大小,会放入unsorted bin中,这时候chunk会有一些有用信息