PWN-UNLINK
Unlink
原理
在利用unlink所造成的漏洞时,其实就是对chunk进行内存布局,然后借助unlink操作来的达成修改指针的效果。
目的和过程
目的是把一个双向链表中的空闲块拿出来 (例如free时和目前物理相邻的free chunk进行合并0)
发生时间
- malloc
- 在恰好大小的large chunk处取chunk时
- 在比请求大小大的bin中取chunk时
- free/malloc_consolidate
- 后向合并:合并物理相邻低地址free chunk时
- 前向合并:合并物理相邻高地址free chunk 时(除top chunk)
- realloc
- 前向扩展:合并物理相邻高地址空闲chunk(除top chunk)
两个check
第一个
// 由于 P 已经在双向链表中,所以有两个地方记录其大小,所以检查一下其大小是否一致(size检查)
if (__builtin_expect (chunksize(P) != prev_size (next_chunk(P)), 0))
malloc_printerr ("corrupted size vs. prev_size");
第二个
// fd bk
if (__builtin_expect (FD->bk != P || BK->fd != P, 0))
malloc_printerr (check_action, "corrupted double-linked list", P, AV);
largebin中还会对next_size双向链表进行完整性检查
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);
即
- check1:检测p的下一个chunk的prev_size是否等于p的size
- check2:p的前一个的后一个和p的后一个的前一个都是自己

浙公网安备 33010602011771号