写过一篇 发表于 2024-5-18 10:01:56

Unlink原理和一些手法

Unlink原理和一些手法

✅简单先容一下unlink相关的知识
unlink是利用glibc malloc 的内存回收机制造成攻击的,核心就在于当两个free的堆块在物理上相邻时,会将他们合并,并将原来free的堆块在原来的链表中解链,加入新的链表中其目的是把一个双向链表中的空闲块拿出来(例如 free 时和目前物理相邻的 free chunk 进行合并)好比说数组这类的.........等等。
前提是我们可以进行溢出修改下一个chunk的fd和bk指针
当我们实现unlink的时候就可以任意所在写,但是现实是残酷的,现在的unlink加了许多保护,我们先看一下界说。
#define unlink(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);
else {                                                            
    FD->bk = BK;                                                      
    BK->fd = FD;                                                      
    if (!in_smallbin_range (P->size)                     
    && __builtin_expect (P->fd_nextsize != NULL, 0)) {         
      assert (P->fd_nextsize->bk_nextsize == P);            
      assert (P->bk_nextsize->fd_nextsize == P);            
      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;            
      }                                    
    }                                    
}                                                                  
}大多是一些保护,其中最重要的是下面这个
//检查p和其前后的chunk是否构成双向链表
if (__builtin_expect (fd->bk != p || bk->fd != p, 0))
    malloc_printerr ("corrupted double-linked list");这是一个关键 check ,那么怎样绕过查抄呢?
64位满足以下式子32位依次类推:
P->fd->bk == P <=> *(P->fd + 0x18) == P
p->bk->fd == P <=> *(p->bk + 0x10) == P那么我们可以将fd设置为*p-0x18 bk设置为*p-0x10,那么我们就可以绕过查抄,那么当我们free下一个chunk的时候就会进行合并,实现了unlink,那么当我们再次修改该chunk的时候指针就会指向*p-0x18的位置进而实现任意所在写。

我们通过标题看一下具体用法标题链接
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Unlink原理和一些手法