unlink

这里记录一下unlink的技术手段,这个还是有一定难度的。
首先我觉得最大的问题是什么是unlink,这个是我学习时最大的一个疑惑。
其实unlink是一个宏

点击查看代码
#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;		      
              }								      
          }								      
      }									      
}

这个看起来还是很难懂。我当时看到也是一脸懵。
https://blog.csdn.net/qq_41202237/article/details/108481889
这里放一个大师傅的博客,它对unlink解释的很好。
我自己的理解就是,unlink是有一定限定条件才可以触发的一种堆的机制。
尤其是需要伪造一个fake chunk去控制好size prev size 和fd以及bk。这样的时候去合并fake chunk,才可以触发unlink。从而达到地址的任意写。

posted @ 2022-07-30 15:06  REPWNER  阅读(3)  评论(0)    收藏  举报