PWN-UNLINK

Unlink

原理

在利用unlink所造成的漏洞时,其实就是对chunk进行内存布局,然后借助unlink操作来的达成修改指针的效果。

目的和过程

目的是把一个双向链表中的空闲块拿出来 (例如free时和目前物理相邻的free chunk进行合并0)

img

发生时间

  • 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的后一个的前一个都是自己
posted @ 2026-01-25 12:08  Pocon  阅读(4)  评论(0)    收藏  举报