各版本堆利用检查总结
前言
之前写题的时候,因为对各个版本的堆不是很熟悉,导致脑子里很乱,完全不知道能做什么。感到很棘手,现在决定重新复习一遍,同时又因为听好多师傅建议分版本总结学习,所以此处顺便总结一下。(其实我感觉写不出来最重要的原因是写的题太少)
正文
简单统计一下常见手法
简单统计
- unlink
- UAF
- Fastbin Attack
- Unsortbin Attack
- Largebin Attack
- Tcachebin Attack
- Off-By-One
- Off-By-Null
简单整理
unlike
chunk块从双链表中取出时,会修改前后相邻块的对应指针。BK->fd = FD
版本:早期
保护:无任何检查
版本:现在
保护:size检查,双向链表检查
UAF
Use After Free,内存块被释放后可以被再次使用,是许多手法的前提
- 版本:始终
来自程序逻辑本身
Fastbin Attack
指所有基于fastbin机制的漏洞利用方法,但是此处仅说明针对Fastbin的相关检查和保护
size检查
版本:始终
场景:申请内存块(malloc)检查size是否与fastbin_index相符
版本: 始终
状态:释放内存块(free)
同时会检查相邻的下一个chunk的size位是否符合标准
地址对齐检查
- 版本:始终
场景:释放chunk (free)
检查要被释放的chunk地址是否对齐
next_chunk的P位检查
- 版本:始终
场景:free
检查:检查该chunk是否属于使用状态,根据物理相邻下一个chunk的P位判断
double free 检查
- 版本:始终
场景: free
为了性能只检查了链表头指向的chunk
指针异或保护
版本:2.32-2.33
场景:free
加入了指针异或防护,在存储next指针时,不再直接存储地址,而是存储( pos >> 12 ) ^ ptr这个结构,pos代表指针地址,而ptr代表在该next指针“想”指向的地址
注:其实我感觉pos更像是heap_base,因为原文注解是这样的:Use randomness from ASLR (mmap_base) to protect single-linked lists of Fast-Bins and TCache. That is, mask the “next” pointers of the lists’ chunks, and also perform allocation alignment checks on them.
版本:2.34-至今
场景:free
key域的值变为一个随机数。
Unsortedbin Attack
相对来说算是一个比较老一些的漏洞了,现在已经基本无法发挥作用。但是索性largebin attack算的上是一个平替。另外现在unsorted bin的特性更多的被用来作为其他漏洞利用方式的辅助。
版本:<2.29
场景:attack可以将在任意地址写一个较大的值,但是在2.29之后要求修改地址是一个特定指针。(实际上2.28时就加上了会检查bck->fd是否正常)(另一个替代方案是tcache_stashing_unlink)
Tcachebin Attack
2.27版本之后加入的机制,关于这个的总结的话直接上链接吧 ==> 传送门
参考文章及源码阅读
- [Glibc高版本堆利用方法总结 - Lynne`s Blog](https://www.cnblogs.com/LynneHuan/p/17822172.html)
- how2heap
- [总结型]记CTF PWN中过气的堆利用 - CSDN
- tcache七星剑法:序言——基础知识与版本变迁 - Jmp.cliff
- house of spirit -CSDN
- [原创]深入理解Pwn_Heap及相关例题 - 看雪论坛
- ptmalloc2 - CTF Wiki (ctf-wiki.org)
- 源码阅读请点这里
结言
好了,大概就先整这么多吧。听完组会之后,感觉自己的思路发生了一些改变,其实正这篇笔记主要是觉得自己之前基础打的不是很牢固,想这趁着这个机会好好整理下,结果发现网络上关于各个版本新加入什么保护这样的资源没有现成的整理好的(其实我觉得更可能是肯定是我没找到),总之苦逼的自己看着源码在整理。不过感觉这两天收获还不错,暂时先不整理了,太菜了我….学学漏洞然后再来吧
哦对了,学了个新名词来着,现在我收集的这些叫补丁(patch),所以我做的事情就是收集新打的补丁,乐…