How2heap学习笔记-1
ubuntu 16.04
glibc 2.23
first_fit
1 |
|
漏洞:UAF
触发步骤:
- 申请两个堆A,B,A大小0x512,B0x256字节(大于fastbin)
- 释放0x512大小的堆A,但指针不置0
- 再申请一个比0x512小的堆C
此时得到的堆C与堆A指针指向同一处
利用指向A的悬垂指针可以修改堆C的内容
fastbin_dup
1 |
|
漏洞类型:double free
Fast bins 主要用于提高小内存的分配效率,单链表链接,默认情况下,对 SIZE_SZ 为 4B 的平台, 小于 64B 的 chunk 分配请求,对于 SIZE_SZ 为 8B 的平台,小于 128B 的 chunk 分配请求,首先会查找 fast bins 中是否有所需大小的 chunk 存在(精确匹配),如果存在,就直接返回
触发步骤:
- 先申请三个堆a,b,c
- 释放a
- 释放b
- 释放a
此时fastbin形成了循环,可以不断申请a,b处的内存
演示中先申请的a和后申请的c指向同一处
fastbin_dup_into_stack
1 |
|
漏洞类型:double free —> fastbin_attack
触发步骤:
- 申请8字节的堆a,b,c
- 释放a,释放b,释放a,形成double free
- 在栈上伪造size位0x20,并把fastbin中堆地址修改为指向size位-8处
- 申请两次堆,得到指针指向栈上地址
(Fastbin_attack主要是通过修改fd指针,伪造一个fake_chunk)
fastbin_dup_consolidate
1 |
|
漏洞类型:double free
fastbins除了在两次free之中加入另外一个free实现double free之外,还可以借助large bin中malloc_consolidate来绕过检查达到double free的目的
触发步骤:
- 申请两个fast chunkA,B
- 释放chunkA
- 申请一个large chunk
- 再释放chunkA
- 申请两次chunk,都得到chunkA
原理:
glibc在分配large chunk(>1024字节)时,首先操作是判断fast bins是否包含chunk。如果包含,则使用malloc_consolidate函数将fastbin中的chunk合并,并放入unsortbins。根据大小放入small bins/large bins
所以再第二次释放A的时候,先前释放的A已经被放到了small bin中,所以不会触发double free检测1
2
3
4
5
6【第一次freeA,并申请large chunk后】
─────────────────────────── Small Bins for arena 'main_arena' ───────────────────────────
[+] small_bins[4]: fw=0x602000, bk=0x602000
→ Chunk(addr=0x602010, size=0x50, flags=PREV_INUSE)
[+] Found 1 chunks in 1 small non-empty bins.




