type
status
date
slug
summary
tags
category
icon
password
fastbin_dup_consolidate什么是malloc_consolidate要求代码部分流程介绍Unsafe Unlink背景前提目标代码部分流程介绍例题:hitcon_2014_stkof思路代码house of spirit要求目的代码部分流程介绍题目:hack-lu-ctf-2014 oreoexppoison null byte要求前置知识:目的代码部分流程介绍large bin attack背景效果代码部分流程介绍House of botcake目的实现流程介绍
fastbin_dup_consolidate
这是利用consolidate的fastbin_dup,最终目的还是达成fastbin_dup
首先注意两个条件:
- tcache bins中最大的chunk大小是
0x4100x400
- 为进入consolidate,需要申请large chunk
什么是malloc_consolidate
该函数主要有两个功能
- 若 fastbin 未初始化,即 global_max_fast 为 0,那就初始化 malloc_state。
- 如果已经初始化的话,就合并
fastbin
中的chunk
。 - 如果是相邻的chunk,就会被合并。
- 如果不是相邻的chunk,就分布被放在相关的chunk
要求
需要涉及到
calloc
,这是因为calloc
在申请内存的时候使用_int_malloc
函数,这个函数在申请内存不是从tcache bins
中获取。而
malloc
函数利用__libc_malloc
,会直接从tcache
中获取chunk代码部分
流程介绍
- 构造7个tcache bin之后,申请一个chunk进入
fastbin
(这里设为p1) ,申请步骤是利用calloc
- 问:这个步骤也可以直接申请8个chunk并free吧?
- 答:不行,因为如果要直接申请chunk到达这个情况:tcache bin中有7个chunk,fastbin中有1个chunk,一定是有一个多余的chunk在top chunk之前。这导致如果要后续申请一个chunk,consolidate
- 申请一个
0x400
左右的large chunk
(设为p2) - 如果fastbin中的第一个chunk和top chunk相邻,结果:申请的p2指向的地址就是p1的地址
- 再次
free(p1).
- 达成double free,同时因为p2直接指向一个被free的内存,达成了UAF
- 不知道是不是只有
- 再次申请
0x400
左右的large chunk
(设为p3) - 达成duplication
Unsafe Unlink
背景
前提
- 适用于除了
fastbin
和tcache bin
以外的链,因为这两个bin是单向链表,且将相同大小的chunk分为一组;unlink
的时候直接从头部取出即可
- 有可以修改的堆溢出,起码要可以修改下一个chunk的
header
中的prev_size
- 未开
PIE
目标
The point of this exercise is to use free to corrupt the globalchunk0_ptr
to achieve arbitrary memory write.
- 将一个
malloc
得到的ptr
指针的值变为&ptr-0x18
,这样通过ptr
能达成对全局变量ptr
(也就是它自身)的修改,达成任意地址写
代码部分
流程介绍
- 连续申请两个大于
tcache
和fastbin
的chunk,分别命名为chunk0_ptr
和chunk1_ptr
- 这是由于这两个bin都是单向链表,不符合条件
- 在
chunk0_ptr
中构建一个虚假的chunk,设为chunk2_ptr
- 形如如下结构,其中假设
&chunk0_ptr=0x1000
- 同时修改
chunk1_ptr
的header部分,让其匹配 - 形如如下结构,修改
chunk1_ptr
的previous_in_use
为0,以及写出其prev_size
大小 - 这样,
chunk0_ptr
中的chunk2_ptr
就是被标记为一个free状态
- 释放
chunk1_ptr
,由于chunk1_ptr
的头部标记着chunk2_ptr
的状态,consolidate会将chunk2_ptr
进行unlink
操作,也就是将它从bin中脱离出来 - unlink中间会有两个指令:
FD→bk = BK
BK→fd = FD
- 同时因为我们的设定:
FD→bk == p
和BK→fd == p
,结果就是p = FD
- 变成
&chunk0_ptr = &chunk0_ptr-0x18
- 此后,通过对
chunk0_ptr
的修改都会修改到全局变量
例题:hitcon_2014_stkof
这是一道和unlink相关的练习题,难度较为简单,只涉及unlink漏洞利用
思路
- 通过unlink将指向指针数组中chunk的指针变为指向全局变量
- 修改其中一项chunk指针,让其指向某个函数got表,将got表中改为其他函数的plt表
代码
house of spirit
要求
- 需要一个指针指向的地址,可以修改这个地址的开始和结束(以一个chunk的标准)部分
目的
- 此攻击将非堆指针添加到
fastbin
中,从而导致(几乎)任意写入。
代码部分
流程介绍
free
7个chunk,填满tcache bin
- 申请一个fake chunk,记为
chunk1
- 修改
chunk1
的size以及chunk1
的末尾,prev_size部分 - fake chunk地址在
ISMMAP
应设置为0,因为对mmap chunk
的处理有另一套流程。 - fake chunk地址必须是
MALLOC_ALIGNMENT
对齐的。具体的,默认情况下32位地址必须8字节对齐,64位16字节对齐。 - fake chunk的
size
和next chunk的size
字段,至少不小于MINSIZE
,即其值默认最少不低于2 * SIZE_SZ
(32位8字节,64位16字节),并且不大于av->system_mem
(system_mem
默认128kb)。 - 进入
fastbins
的fake chunk其size必须不超过max fast size(DEFAULT_MXFAST 64 * SIZE_SZ / 4)。
- 释放
chunk1
,chunk1
被放进fastbin
中,可以得到利用
题目:hack-lu-ctf-2014 oreo
exp
参考:
poison null byte
要求
- 当有一个off-by-one的漏洞,且可以覆盖
malloc
的chunk后一位
前置知识:
- unsorted bin
- 为双向循环链表
- 当存在
unsorted bin
且申请chunk需要在unsorted bin中查找时: - 若申请
chunk0 < unsorted bin中chunk
,则unsorted bin中切割出chunk0
大小内存,剩余内存仍保留在bin中 - 若申请
chunk0 > unsorted bin中chunk
,则unsorted bin中的chunk会根据大小被分进smallbin
或者largebin
中,同时在largebin
中会以从大到小次序排列
- largebin
- 双向链接的循环列表,存在
fd_nextsize
和bk_nextsize
- 当相邻chunk大小不一致时,
fd_nextsize==fd
,bk_nextsize==bk
目的
代码部分
流程介绍
- 首先需要判定是否能保证
fake chunk
的倒数第二byte是\x00
- 原因是方便进行构造,详细内容后面补充
- 申请出这样的chunk结构:
- 构造存在三个不同大小chunk的
largebin
-
header <-> [b, size=0x520] <-> [prev, size=0x510] <-> [a, size=0x500]
中,对prev来说,fd_nextsize==fd
, bk同理
- 申请
prev
出来,构造一个fake chunk
在prev
中,设为chunk0
,chunk0->fd == a
,chunk0->bk == b
- 申请
b
出来,设为b2
,此时b2->fd == a
- 覆盖b2的前两个字节,将其变为
0x0010
,这样b2->fd == chunk0's chunk pointer
- 将
a
重新放入unsortedbin
,方便修改 free(victim)
,这样header <-> [victim, size=0x500] <-> [a, size=0x500]
- 再将
a
申请出来,设置a→bck==chunk0
- (此处开始漏洞利用)此时如果
prev
可以有off-by-null
,可以将victim的chunk_size
从0x501
变为0x500
,将chunk0
的标志位设置为free - 这样在
free(victim)
的时候,就会将chunk0
也识别为free,同时进行merge - 这样就导致
prev2
和malloc
后的地址是一样的,达成漏洞利用
large bin attack
背景
glibc2.30
之后关于large bin attack出现了新的防御措施但是在
how2heap
中仍存在相关路线利用相关代码:
效果
- 能够进行对任意指定的address中的值更改为一个大值(一个heap地址)
代码部分
- 源代码
- 结果展示
流程介绍
- 指定一个想要对其进行更改的地址,记为
addr
- 准备large bin中的chunk,记为
p1
- 注意是从unsorted bin中转移到
largebin
中,需要重新申请一个大chunk
- 将
p1->bk_nextsize
修改为addr-0x20
- 重新申请一个小于
p1
大小,并在large bin范围的chunk,将其转移进largebin
- 由于若是转移进
largebin
的chunk小于largebin
中的最小的chunk,则会绕过检查bk_nextsize
- 当最小的
p2
进入bin之后,addr
的值变为p2
的地址,同时 - 相关代码:
House of botcake
目的
- 绕过对
tcache
中的double free的限制,实现对tcache bin中某个chunk的dup
实现
- 输出结果
流程介绍
- 准备7个chunk用于填充
tcachebin
,同时多准备两个chunk用于vulnerability
,再准备一个padding
用于避免consolidation
vulnerability
中第一个chunk命名为prev
,第二个chunk命名为victim
- 填充满
tcachebin
free(victim)
- 继续对
prev
进行free,这样就导致consolidation
,两者合二为一
- 申请一个
tcache
中的chunk,然后重新释放victim - 这样victim就同时存在于
tcachebin
和unsortedbin
中,可以对其进行重写了