首页 > 其他分享 >Unlink原理和一些手法

Unlink原理和一些手法

时间:2024-04-25 20:55:37浏览次数:23  
标签:unlink FD chunk bk fd 手法 nextsize 原理 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的位置进而实现任意地址写。

我们通过题目看一下具体用法题目链接

标签:unlink,FD,chunk,bk,fd,手法,nextsize,原理,Unlink
From: https://www.cnblogs.com/CH13hh/p/18158419

相关文章

  • 栈(Stack)的原理与代码实现
    栈(stack)原理说明:​ 学习数据结构的目的是为了更好的处理和存储数据,对于顺序表而言改查比较容易,增删比较麻烦,对于链式表而言,增删比较简单,改查比较麻烦,所以每种数据结构都有不同的特点,用户需要选择合适的数据结构。​ 栈内存自顶向下进行递增,其实栈和顺序表以及链式表都一样,都属......
  • 容斥原理
    容斥原理:容斥原理是一种在知道所有集合之间的交,求集合之间的并的数学方法。(注:交即为两个集合之间相同的部分,记作\(|A|\cap|B|\))problem:设\(U\)中元素有\(n\)种不同的属性,而第\(i\)种属性称为\(P_i\),拥有属性\(P_i\)的元素构成集合\(S_i\),现在请求出\(U\)中有哪......
  • mock的原理是什么?
    Mocking是软件测试中常用的一种技术,它的原理是通过模拟(模仿)外部依赖或对象的行为,以便在测试中隔离被测系统的部分,使得测试更加简单、可控、可重复。Mocking的原理可以简单描述如下:替换外部依赖:在测试过程中,被测系统通常会依赖于外部组件、服务或对象,例如数据......
  • ELF文件格式解析器 原理 + 代码
    参考:https://bbs.kanxue.com/thread-259901.htm写在前面:   读《Linux二进制》,发现作者对ELF文件格式部分并没有做详细介绍,为了加深对elf文件格式理解,我自己着手写了个解析器,会和readelf工具协同对比。 原理:  ELF文件(目标文件)格式主要三种:1.可重定向文件(Re......
  • BOSHIDA DC电源模块的原理及工作方式
    BOSHIDADC电源模块的原理及工作方式DC电源模块是一种将交流电转换为直流电的设备,它将交流电输入端转换为稳定的直流电输出,以供电子设备使用。DC电源模块的工作原理及工作方式如下。 DC电源模块主要由以下几个主要组成部分构成:1.变压器:DC电源模块的输入端通常接收交流电,而......
  • springboot源码:容器启动过程(扩展业务对象、bean 生命周期)&动态注册自己的业务对象&
    0.SpringbootRun方法启动org.springframework.boot.SpringApplication#run(java.lang.String...)启动 publicConfigurableApplicationContextrun(String...args){ longstartTime=System.nanoTime(); DefaultBootstrapContextbootstrapContext=createBootstrap......
  • Java并发工具类之LongAdder原理总结
    出处: Java并发工具类之LongAdder原理总结LongAdder实现原理图                                高并发下N多线程同时去操作一个变量会造成大量线程CAS失败,然后处于自旋状态,导致严重浪费CPU资源,降低了并发......
  • 浅谈端口扫描原理
    一、端口扫描简介端口扫描,顾名思义,就是逐个对一段端口或指定的端口进行扫描。通过扫描结果可以知道一台计算机上都提供了哪些服务,然后就可以通过所提供的这些服务的己知漏洞就可进行攻击。其原理是当一个主机向远端一个服务器的某一个端口提出建立一个连接的请求,如果对方有此项服......
  • 【编译原理】原理笔记
    随便记点防止期末烂掉语法分析直接左递归的消除实际就是左递归转右递归法1:直接替换\[A\rightarrowA\alpha|\beta\Rightarrow\begin{cases}A\rightarrow\betaA',\\A'\rightarrow\alphaA'|\epsilon\end{cases}\]法2:矩阵法前置知识:\[I=\begin{pmatrix}\epsilo......
  • 将彩色图转化为灰度图及其原理介绍
    彩色图介绍彩色图像是一种包含颜色信息的图像,通常由红色、绿色和蓝色(RGB)三个颜色通道组成。这三种颜色通道可以叠加在一起来形成各种不同的颜色。彩色图像中的每个像素都有三个数值,分别表示红色、绿色和蓝色通道的强度或亮度。这三个数值通常在0到255之间,其中0代表没有该颜色通......