unsorted bin attack
对unsorted bin中的chunk->bk
进行修改,接下来该chunk分配出去时,chunk->bk->fd
就被赋值为unsortedbin头结点地址。
1
2
3
4
| bck = victim->bk;
/* remove from unsorted list */
unsorted_chunks (av)->bk = bck;
bck->fd = unsorted_chunks (av);
|
在glibc2.28中增加了以下检查,使得此攻击失效。
1
2
| if (__glibc_unlikely (bck->fd != victim))
malloc_printerr ("malloc(): corrupted unsorted chunks 3");
|
unsorted bin attack通常为进一步的攻击做准备,比如覆写global_max_fast。
0ctf2016 zerostorage
1
2
3
4
5
6
| Arch: amd64-64-little
RELRO: Full RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled
FORTIFY: Enabled
|
关键数据结构
flag:标识该节点是否存在
size:记录大小
content:数据块指针
程序有以下功能
1
2
3
4
5
6
7
| 1. Insert
2. Update
3. Merge
4. Delete
5. View
6. List
7. Exit
|
insert:获取数据块大小,并读入数据。数据块大小在128~4096这个范围内
update:对数据块进行大小内容进行更新
merge:将两节点合并。这里存在漏洞,输入两次相同的id,导致UAF。这个漏洞我没发现,思维还不够猥琐啊
delete:释放数据块,清空节点
总体思路
通过UAF,首先泄露libc基址,然后修改其bk指针,使用unsorted bin attack修改global_max_fast变量;fastbin bin attack覆写__free_hook
为system函数地址。