libc使用的是ptmalloc2格式
在C语言上就是malloc和free管理的堆操作接口
可以从堆中申请一块内存,也可以释放一块内存
堆与libc的关系:
打堆题需要着重注意libc版本,因为每个libc版本的malloc和free的对安全的校验是不一样的
从2.23开始到现在的2.39,在申请或释放堆块的时候,对内存的校验越来越严格,也就越来越难利用
我们来缕一缕libc的时间线
2.23
fastbin:对size和对应fastbinsize的校验
smallbin:新增对完整性的检查(并不完整)bck→fd==victim
unsortedbin:检查victim size是否合理
对bck→fd是否等于victim进行校验(甚至堆块切割的时候也有校验)
unlink:对双向链表(largebin)增加对完整性的校验
if (__builtin_expect (fd->bk != p || bk->fd != p, 0))
malloc_printerr ("corrupted double-linked list");
对largebin 增加对nextsize系列的完整性校验
2.24
对vtable是否处于合法内存位置增加了校验
2.26
引入tcache 这个时候的tcache纯裸奔 随便打
2.27
unlink:新增对presize和size的一致性校验
if (chunksize (p) != prev_size (next_chunk (p)))
malloc_printerr ("corrupted size vs.
2.28∶
unsortedbin:新增对链表完整性的校验
也就是会校验victim→fd是否等于unsortedbin头 不影响unsortedbin写入一个大值
2.29:
tcache:结构体新增key字段(放在了bk字段)这个key校验过程发生在free过程,主要为了防止double free
unsorted bin:除了对本身size检查以外
还增加了对下一个的size校验
下一个的presize校验
以及下一个的pre inuse位校验 unsortedbin attack基本失效
还有双向链表的检验
top:新增对size的校验 遏制了house of force
2.32
fastbin:校验堆块是否对齐
if (__glibc_unlikely (misaligned_chunk (victim)))
malloc_printerr ("malloc(): unaligned fastbin chunk detected 2");
单链表:引入了safe linking
单链表fd的值变成了P xor (L>>12)
泄露出堆地址之后即可正常伪造fd
2.34
取消了malloc_hook realloc_hook free_hook exit_hook等各种hook
自此堆利用方向转向iofile
2.35以后
有传言说要对wfile的vtable也增加内存安全校验,我认为也应该增加 这样一部分iofile利用也会失效
不过实测2.38还未增加
pwndbg查看堆空间技巧:
vmmap
查看已申请的堆块里面的细节:
pwndbg:
heap