Heap Buffer overflow
分配好的变量区域存在越界写入漏洞,使下一块chunk内容被改掉。
UAF (use after free)
chunk被free后,指向该chunk的point是dangling point。后续这个被free的chunk再被程序使用就是UAF。
Hooks
在malloc、free进入到主要的分配算法前,如果有hook function,则会先执行hook function,向 hook function写入我们要执行的内容,就可以控制程序执行流程。写入one gadget就可以得到shell。
Double free
程序以chunk 1的point为参数执行free时,chunk 1进入fastbin,之后再以chunk 2的point执行free,chunk 2进入fastbin,之后再free一次chunk 1,chunk 1再次进入fastbin。
fastbin—>chunk 1---->chunk 2---->chunk 1…,这就构成double free。
Fastbin Dup
在double free的基础上,向chunk中的fd写入任意位置可以是return add或hook function这种可以控制程序执行流程的位置,在之后的malloc会遇到这个特殊fd的chunk,类似于任意写入。libc2.26后fast chunk会先进入tcache。
libc 2.23含有几道安全检查:
1、_int_free会检查临近的下一块的chunk size是否合理,至少要大于0x10。
2、_int_free中含有double free的检查机制,程序要求目前free掉的chunk和fastbin中的第一个chunk是否相同,如果相同,则检测到double free。绕过方式就是在第二次free掉这个chunk之前,先free掉其他的chunk。
3、_int_malloc中也含有一道检查机制,在malloc取出chunk时,会检查拿出的chunk size和fastbin的size是否一致。
libc不同版本中检查机制也大同小异,具体可以看看source code。
Tcache Dup
libc2.26后的fast chunk 会先进入到tcache,tcache dup类似fastbin dup,同样是在double free 的基础上,向chunk中的fd写入任意位置可以是return add或hook function这种可以控制程序执行流程的位置,在之后的malloc会遇到这个特殊fd的chunk,作用也类似于任意写入。
libc 2.27未包含要free掉的chunk是否与链上的第一个chunk一样,所以可以直接进行二次free chunk。利用方式更简单。libc不同版本中检查机制也大差不差,具体可以看看source code。
Unsorted bin
unsorted bin是一个双向链表,存放着被free掉的但没有被fastbin和tcache回收的chunk,被free的chunk如果没有进到fastbin或tcahce,会检查物理位置临近的上一块chunk是不是free掉的,如果是则合并到一起,如果不是,检查物理位置临近的下一块chunk是不是top chunk,如果是则合并到一起,如果不是,再检查是不是free掉的呢,是的话,就合并这个临近的chunk,然后加入到unsorted bin里面。
结构大致如下: