Unlink原理和一些手法

这篇具有很好参考价值的文章主要介绍了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的位置进而实现任意地址写。

我们通过题目看一下具体用法题目链接🔗https://pan.baidu.com/s/1lEba9fl8Yt56MvC6fj3xjQ?pwd=w6du提取码:w6du

首先看保护

Unlink原理和一些手法

got表可修改,我们ida载入看一下

Unlink原理和一些手法

是一些菜单什么的,其中有一个隐藏选项,看一下

Unlink原理和一些手法

好家伙是后门函数,但是他有条件,magic处地址的值必须大于等于114514才可以执行

Unlink原理和一些手法

值得注意的是edit函数没有对我们输入的修改长度进行检查,那么我们可以使用unlink修改magic地址的值

✅思路:

1.先申请4个较大的chunk(方便到时候我们进行伪造)4个chunk是因为*p-0x18可以指向第一个chunk,最后一个用来free

2.编辑chunk进行伪造修改bk和fd指针,实现unlink

3.修改magic处地址的值为理想的值,选择隐藏选项得到flag

先贴一下wp我再详细解释

Unlink原理和一些手法

Unlink原理和一些手法

 

这里采用下标为3的数组是因为当设置完bk和fd之后会指向第一个下标(*p-0x18),那么我们再次修改下标为0的chunk数据是理想数据下标为3的数组为magic地址那么

相当于magic的地址为我们理想的值(3->0->magic)中间把下标为3的chunk分割成了两个chunk,伪造fd和bk以及下一个chunk的头部使当前chunk为free状态,那么再free下一个chunk就可以完成unlink,最后再进行修改就好啦具体可以参考这个图和这个链接https://blog.csdn.net/qq_35493457/article/details/105857572

Unlink原理和一些手法文章来源地址https://www.toymoban.com/news/detail-858088.html

到了这里,关于Unlink原理和一些手法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Kafka关键原理加强及一些面试题

    发文章是对自己所学的内容做个记录, 同时看看能否帮助更多需要帮助的人 . 6.kafka关键原理加强 6.1 日志分段切分条件 日志分段文件切分包含以下4个条件,满足其一即可: 当前日志分段文件的大小超过了broker端参数 log.segment.bytes 配置的值。 log.segment.bytes参数的默认值为 10

    2024年02月09日
    浏览(36)
  • FPGA中一些基本概念原理的区分

    在 Verilog 中,wire 和 reg 是两种不同类型的变量,它们有着不同的特性和用途 wire 变量用于连接模块中的输入、输出以及内部信号线。 它主要用于表示连续赋值的逻辑连接,类似于硬件电路中的导线。 wire 变量不能在 always 块或 initial 块中赋值,它们只能通过连续赋值“assig

    2024年02月21日
    浏览(39)
  • Linux提权手法整理

    之前写过了windows提权小结,这下一篇水什么就有了嘛,于是有了这篇水文,整理一下Linux提权 前篇windows提权小结 ,链接送上 https://www.cnblogs.com/lcxblogs/p/14163338.html    0x00 前言 同windows提权的目的,也是从普通用户权限提升到管理员权限,以便实现读写敏感文件、横向移动进

    2024年02月08日
    浏览(41)
  • SqlServer常见攻击手法

    Mssql是什么: mssql的英文全称是Microsoft SQL Server,一般简称MS-SQL或SQL Server;它是指微软的SQLServer数据库服务器,是一个关系型数据库管理系统。 mssql的用户权限 Mssql数据库是可以选择以windows用户密码进行登录的 数据库角色的成员可以分为如下几类: Windows用户组或用户账户

    2024年02月05日
    浏览(75)
  • 内网横向常用手法

    以下操作都是在我们知道用户和密码的情况下进行验证的,前期除了收集明文密码HASH等,还收集了用户名,用户名配合密码字典,进行上面的批量验证 关于IPC$+计划任务的横向,我们的目的非常明确: (1)首先建立向目标主机的IPC$连接 (2)其次把命令执行的脚本传到目标

    2023年04月09日
    浏览(39)
  • wireshark抓包过滤手法

    1 抓包过滤器类型Type(host,net,port) 2 方向Dir(src,dst) 3 协议Proto(ether,ip,tcp,udp,http,icmp,ftp等) 逻辑运算符( 与,||或,!非) 协议过滤 在抓包过滤框中直接输入协议名即可,tcp,只显示tcp协议的数据包列表 IP过滤 host 192.168.1.104 (查询所有这个ip的数据包)

    2024年02月06日
    浏览(51)
  • 【JavaEE】网络原理:网络中的一些基本概念

    目录 1. 网络通信基础 1.1 IP地址 1.2 端口号 1.3 认识协议 1.4 五元组 1.5 协议分层 什么是协议分层 分层的作用 OSI七层模型 TCP/IP五层(或四层)模型 网络设备所在分层 网络分层对应 封装和分用 概念: IP地址主要用于标识网络主机、其他网络设备(如路由器)的网络地址。简

    2024年01月24日
    浏览(40)
  • Windows提权流程及手法

    收集本机systeminfo中补丁信息 在提权辅助平台 https://i.hacking8.com/tiquan/ 中查询可利用exp 查询exp,选择对应的Exp下载运行 提权Exp的运行方式,一般有以下几种: 1、直接执行exe程序,成功后会打开一个cmd窗口,在新窗口中权限就是system 2、在WebShell中执行exe程序,执行方式为xxx

    2024年02月08日
    浏览(42)
  • 【网络原理】TCP 协议中比较重要的一些特性(三)

    目录 1、拥塞控制  2、延时应答 3、捎带应答 4、面向字节流 5、异常情况处理 5.1、其中一方出现了进程崩溃 5.2、其中一方出现关机(正常流程的关机) 5.3、其中一方出现断电(直接拔电源,也是关机,更突然的关机) 5.4、网络断开 和流量控制一样,也是用来限制发送方的

    2024年03月18日
    浏览(57)
  • 【网络原理】TCP 协议中比较重要的一些特性(一)

    目录 1、TCP 协议 2、确认应答 2.1、确认序号 3、超时重传 4、连接管理 4.1、建立连接(三次握手) 4.2、断开连接(四次挥手) TCP 是工作中最常用到的协议,也是面试中最常考的协议,具有面向连接, 可靠传输 ,面向字节流,全双工的特点,其中可靠传输是 TCP 安身立命的本

    2024年04月10日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包