large bin attack
还是hgame(让我们说谢谢hgame),之前学的时候有看到过这个攻击方式,当时觉得很鸡肋,现在啪啪打脸━((*′д`)爻(′д`*))━!!!!
原理
large bin attack需要利用的是malloc里将chunk从unsorted bin摘除,放入large bin的过程,相关源码如下(ps:再放一遍largebin结构)(pps:chunk链的头结点的bk指向更大的chunk链的头节点,尾结点的fd指向更小的chunk链的头节点):
1 |
|
利用一
这种利用方法利用的是第一个
1 |
|
实现效果任意地址写一个堆地址
实验代码如下:
1 |
|
- 先申请四个chunk,其中pad1、pad2用于隔离,防止合并
- 释放chunk1进入unsorted bin
- 申请pad3,unsorted bin中的chunk1放进large bin,此时chunk1的fd_nextsize和bk_nextsize都指向自己
- 释放chunk2,chunk2进入unsorted bin
- 更改chunk1的bk_nextsize为g_Target-0x20
- 申请一个chunk,chunk2进入large bin。由于chunk2小于chunk1,执行以下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16victim_index = largebin_index (size);
bck = bin_at (av, victim_index);
fwd = bck->fd;
……
fwd = bck;
bck = bck->bk;//chunk1
victim->fd_nextsize = fwd->fd;
//chunk2->fd_nextsize=chunk1
victim->bk_nextsize = fwd->fd->bk_nextsize;
//chunk2->bk_nextsize=chunk1->bk_nextsize=g_Target-0x20
fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim;
//chunk1->bk_nextsize=chunk2
//(g_Target-0x20)->fd_nextsize=*g_Target=chunk2 - 更改成功
ps:示意图如下:
利用步骤
- malloc一块size1大小的large chunk(chunk1)
- malloc一块随便大小的chunk(防止合并)
- malloc一块size2大小的large chunk,要求size2<size1且size1和size2在同一个large bin范围内
- malloc一块随便大小的chunk(防止合并)
- free(chunk1),chunk1进入unsorted bin
- malloc一块size3的large chunk,要求size3>size1(不触发分割),chunk1进入large bin
- free(chunk2),chunk2进入unsorted bin
- 修改chunk1->bk_nextsize=Target-0x20
- malloc一块chunk(大小不等于size2),chunk2进入large bin,触发large bin attack
利用二
2.30以前
这种方法利用的是第二个else,实现效果是任意地址写两个堆地址
实验代码如下(实验代码来源于how2heap代码,删除了一些输出):
1 |
|
- malloc一个size1的chunk(chunk1)
- malloc随便一个chunk防止合并
- malloc一个size2的chunk(chunk2),要求size1<size2
- malloc随便一个chunk防止合并
- malloc一个size3的chunk(chunk3),要求size2<size3且在一个large bin的范围内
- malloc随便一个chunk防止合并
- free掉chunk1和chunk2,进入unsorted bin
- malloc一个size4的chunk,chunk1和chunk2先进入large bin,然后切割chunk1返回,剩下的chunk1_left被放入unsorted bin
- free掉chunk3,chunk3放进unsorted bin
- 修改chunk2如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15修改前:
chunk2
size -> size2
fd -> large bin
bk -> large bin
fd_nextsize -> chunk2
bk_nextsize -> chunk2
修改后:
chunk2
size -> size2
fd -> null
bk -> target1-0x10
fd_nextsize -> null
bk_nextsize -> target2-0x20 - 随便malloc一个chunk,chunk1_left进入small bin,chunk3放进large bin,然后从chunk1_left中切割返回(剩下的放进unsorted bin)
重点分析下chunk3放进large bin这一步:
由于size2<size3,所以chunk3会插入chunk2和large bin中间,执行else中的第二个else部分代码(如下):1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31victim_index = largebin_index (size);
bck = bin_at (av, victim_index);//large bin
fwd = bck->fd;//chunk2
……
victim->fd_nextsize = fwd;
//chunk3->fd_nextsize=chunk2
victim->bk_nextsize = fwd->bk_nextsize;
//chunk3->bk_nextsize=chunk2->bk_nextsize=target2-0x20
fwd->bk_nextsize = victim;
//chunk2->bk_nextsize=chunk3
victim->bk_nextsize->fd_nextsize = victim;
//chunk3->bk_nextsize ->fd_nextsize =
//(target2-0x20) ->fd_nextsize =chunk3
//target2 =chunk3
bck = fwd->bk;
//bck=chunk2->bk=target1-0x10
……
mark_bin (av, victim_index);
victim->bk = bck;
//chunk3->bk=target1-0x10
victim->fd = fwd;
//chunk3->fd=chunk2
fwd->bk = victim;
//chunk2->bk=chunk3
bck->fd = victim;
//(target1-0x10)->fd=chunk3
//target1=chunk3 - 更改成功
ps:示意图如下:
利用步骤
- malloc一个size1的chunk(chunk1)
- malloc随便一个chunk防止合并
- malloc一个size2的chunk(chunk2),要求size1<size2
- malloc随便一个chunk防止合并
- malloc一个size3的chunk(chunk3),要求size2<size3且在一个large bin的范围内
- malloc随便一个chunk防止合并
- free掉chunk1和chunk2
- malloc一个size4的chunk,要求size1-size4属于small bin
- free掉chunk3
- 修改chunk2如下:
1
2
3
4
5
6chunk2
size -> size2
fd -> null
bk -> target1-0x10
fd_nextsize -> null
bk_nextsize -> target2-0x20 - 随便malloc一个chunk,size<size1-size4,触发large bin attack
2.30以后
增加检查
1 |
|
利用二不成立了,只能使用利用一
例题hgame 2023 week3 large_note
思路
看到这个名字第一反应就是large bin attack,但参见上文↑,我一直觉得这个漏洞很鸡肋不知道怎么用。直到我半夜搜到👉这个👈
这道题最大的问题就是申请的chunk过大不在tcache的范围内,不能uaf。但large bin attack可以在tcache_max_bin处写下大至,使得更大的chunk能够放进tcache就可以uaf了(tcache_max_bin在mp_+80的地方,本身值为0x40),具体操作见上
之后步骤同safe_note
exp
1 |
|
large bin attack
http://akaieurus.github.io/2023/01/25/large-bin-attack/