unlink_heap

关于unlink heap

unlink是一个libc中定义的宏操作,以下是关于它的源码(libc2.23)

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
#define unlink(AV, P, BK, FD) {                                            
FD = P->fd;
BK = P->bk;
if (__builtin_expect (FD->bk != P || BK->fd != P, 0))
malloc_printerr (check_action, "corrupted double-linked list", P, AV);
else {
FD->bk = BK;
BK->fd = FD;
if (!in_smallbin_range (P->size)
&& __builtin_expect (P->fd_nextsize != NULL, 0)) {
if (__builtin_expect (P->fd_nextsize->bk_nextsize != P, 0)
|| __builtin_expect (P->bk_nextsize->fd_nextsize != P, 0))
malloc_printerr (check_action,
"corrupted double-linked list (not small)",
P, AV);
if (FD->fd_nextsize == NULL) {
if (P->fd_nextsize == P)
FD->fd_nextsize = FD->bk_nextsize = FD;
else {
FD->fd_nextsize = P->fd_nextsize;
FD->bk_nextsize = P->bk_nextsize;
P->fd_nextsize->bk_nextsize = FD;
P->bk_nextsize->fd_nextsize = FD;
}
} else {
P->fd_nextsize->bk_nextsize = P->bk_nextsize;
P->bk_nextsize->fd_nextsize = P->fd_nextsize;
}
}
}
}

攻击效果:将一个chunk从其bin链表中摘除

可以理解为将:

img

变为:

img

即:

1
2
3
4
chunk2_fd = chunk1_prev_addr
chunk2_bk = chunk3_prev_addr
chunk1_bk = chunk3_prev_addr
chunk3_fd = chunk1_prev_addr

chunk状态检查

原作者:好好说话之unlink-CSDN博客

Linux执行一些代码前会对chunk进行一些检查,以下三点就是检查chunk是否空闲的三大标准。

image-20240603201052940

  • 检查1:检查与被释放chunk相邻高地址的chunk的prevsize的值是否等于被释放chunk的size大小

  • 检查2:检查与被释放chunk相邻高地址的chunk的size的P标志位是否为0

  • 检查3:检查前后被释放chunk的fd和bk

具体利用可以看:好好说话之unlink-CSDN博客


unlink_heap
http://ak0er.github.io/2024/05/05/unlink-heap/
作者
Ak0er
发布于
2024年5月5日
许可协议