Unlink原理和一些手法

打印 上一主题 下一主题

主题 832|帖子 832|积分 2496

Unlink原理和一些手法

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

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

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表