关于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链表中摘除
可以理解为将:

变为:

即:
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是否空闲的三大标准。

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