fastbins_Double Free调试

我大哥给我出了一题pwn heap题,当时现场的时候没解出来,想岔了。事后感概自己还是理解的不够透彻。决定认真再次调试下。用的是2.23版本的how2heap中fastbins_dup.c。


        简单用gcc编译下,然后带源码调试:


生成一个a.out的文件:


然后进入pwngdb中调试:


我们把断点断在主函数的位置:


然后r命令执行过去就会进入带源码调试的主函数:


直接讲程序流控制到第一个malloc处:


然后我们直接s命令进入底层去观察做了什么:


这是malloc函数开始的真正位置,一开始为开辟栈帧做准备,接着将[rip+0x33fd63]内存里的东西传给RAX寄存器,继续跟下去,我们看到rax是一个函数:



这个函数的意思是对malloc_hook做一个初始化的工作。接着会跳转到malloc+360的地方执行:


接着会去执行malloc_hook_ini函数:


紧接着在执行malloc_hook_ini的过程中,又调用了其他函数:


通过对汇编以及源码的对照,这个call函数是ptmalloc_init():


到目前为止,程序执行流程大致是glibc在malloc真正执行前,会先去检查是否有用户自定义的hook函数,如果有,就先行调用,如果没有就按正常的malloc执行。

没有hook函数情况下调用链: __libc_malloc --> _ini_mallac --> 执行fastbins分配逻辑

存在hook函数情况下调用链:__libc_malloc --> malloc_hook_ini -->ptmalloc_init --> _ini_malloc->执行fastbins分配逻辑


一些细节上的处理,我没有跟下去,但是在malloc执行前,大致是做了这些步骤。我们程序中传入的参数是8 --> malloc(8)。 我们知道glibc的Malloc函数会根据用户传入的参数判断申请多大的内存。在我们程序第一次分配内存的时候,bins中是没有任何可以用的内存。因此会从top chunk中为我们分割需要的内存:


紧接着执行2个malloc(8):

此时三个堆都分配好了:


而此时bins是没有东西的:


紧接着我们开始执行free函数的时候再来观察:


现在我们要释放a的内存空间:


我们首先得知道,在fastbins中,被释放的chunk都是单链表链接起来的。因此只有fd指针生效。

此时一切都正常。如果我们此时再次释放a这块内存的话,程序会奔溃,因此我们得先释放其他块,接下来释放b这块内存:



此时我们知道了一件事,fastbins组织被free掉的chunk是采用头插头删的。我们可以看看真实内存布局:


到此为止一切OK,接下来就是漏洞的地方,如果我们这个时候接着再次释放a会发生什么:



此时我们在fastbins中会有三个chunk,因为libc没有再这里设置过硬的检查,并且这块空间在free的时候没有置为NULL,因此这片空间能够被当成正常的chunk在fastbins中链接。大致结构图示如下:


因此此时如果申请大小跟fastbins中一样的chunk,将会把a这块空间分配2次:



这就是fastbins的double free漏洞。

利用点的话通常是利用double free来进行任意地址读写,然后利用mallc_hook或者free_hook进行s申请和释放前来执行system("bin/sh")。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/136136.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode刷题日记:111. Minimum Depth of Binary Tree(二叉树的最小深度)

给我们一个二叉树,我们应该如何来求二叉树的最小深度呢? 二叉树的最小深度指的是叶子结点到所处的位置最小的,这就是二叉树的最小深度,也就是说我们要找的是离根结点最近的叶子结点。如果我们从根结点向下出发寻找叶子节点&#x…

移动硬盘和u盘的区别哪个好 移动硬盘和u盘有啥区别

在数字时代的今天,数据存储已经成为我们生活中的重要一环。当我们需要移动、备份或传输大量数据时,常常会不知道是选择移动硬盘还是U盘。其实,对于许多人来说,移动硬盘和U盘之间的区别并不清晰。下面我们就来看移动硬盘和u盘的区别…

思科9300交换机使用USB进行升级ISO

一、下载ISO 一、网址 Software Download - Cisco Systems 二、找到型号 四、选择XE 软件 五、进行下载 二、COPY 进 U盘 一、、请注意!如果你的U盘不是Fat32文件格式则交换机读取不了,请先格式化再复制文件。 二、下载后将 bin文件复制到U盘。 1.扩展…

经典OJ题:重排链表

题目: 给定一个链表,在进行重排前: 进行重排链表后: 如上图所示,所谓的重拍链表,就是将第一个节点连接第倒数第一个节点,第二个节点连接倒数第二个节点,以此类推,最后在连…

【matlab】KMeans KMeans++实现手写数字聚类

目录 matlab代码kmeans matlab代码kmeans MNIST DATABASE下载网址: http://yann.lecun.com/exdb/mnist/ 聚类 将物理或抽象对象的集合分成由类似特征组成的多个类的过程称为聚类(clustering)。 对于给定N个n维向量x1,…,xN∈Rn,聚类的目标…

贪心

【深基12.例1】部分背包问题 题目描述 阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 N ( N ≤ 100 ) N(N \le 100) N(N≤100) 堆金币,第 i i i 堆金币的总重量和总价值分别是 m i , v i ( 1 ≤ m i , v i ≤ 100 ) m_i,v_i(1\le m_i,v_i \le 100) mi​,vi​(…

统计学_蒙特卡罗方法

1、蒙特卡罗方法的基本思想 蒙特卡罗方法(Monte Carlo method)是由冯诺依曼和乌拉姆等人发明的,“蒙特卡罗”这个名字是出自摩纳哥的蒙特卡罗赌场,这个方法是一类基于概率的方法的统称,不是特指一种方法。 蒙特卡罗方法也成统计模拟方法&am…

SpringBoot3数据访问

SpringBoot3数据访问 SpringBoot整合 Spring、SpringMVC、MyBatis进行数据访问开发。 整合SSM场景 整合步骤 1、创建SSM整合项目 ①数据库准备 DROP TABLE IF EXISTS t_user; CREATE TABLE t_user (id bigint NOT NULL AUTO_INCREMENT COMMENT 编号,login_name varchar(200)…

前端---认识HTML

文章目录 什么是HTML?HTML的读取、运行HTML的标签注释标签标题标签段落标签换行标签格式化标签图片标签a标签表格标签列表标签表单标签form标签input标签文本框单选框复选框普通按钮提交按钮文件选择框 select标签textarea标签特殊标签div标签span标签 什么是HTML&a…

2.1 CE修改器:精确数值扫描

本关是CE修改器的第一关,用户需要通过 Cheat Engine 工具完成精确扫描值。在这个练习中,需要将一个特定的数值(健康值)改变为 1000。首先,要确保数值类型设置正确,默认的是2字节或4字节。接着,选…

(三)正点原子I.MX6ULL kernel6.1挂根文件系统

一、概述 移植NXP官方最新的linux kernel(linux-imx-lf-6.1.y) 移植方法基本参照正点原子教程 移植开发板:正点原子阿尔法2.1 二、添加开发板到内核 进入内核目录下,先修改Makefile 打开终端: cp arch/arm/configs/im…

Nginx:如何实现一个域名访问多个项目

1. 背景介绍 最近在多个项目部署中遇到这样一个问题,一个域名如何实现多个项目的访问。因为不想自己单独去申请域名证书和域名配置,便想到了这个方案,结合Nginx的location功能实现了自己的需求,便记录下来。示例中是以项目演示&a…

Unity - 各向异性 - 丝绸材质

文章目录 目的环境主观美术效果的[假]丝绸基于物理的方式ProjectPBR filament web captureReferences 目的 拾遗,备份 环境 Unity : 2020.3.37f1 Pipeline : Builtin Rendering Pipeline 主观美术效果的[假]丝绸 非常简单 : half specualr pow(1 - NdotV, _Edg…

RT-Thread Studio开发 新手入门

文章目录 前言一、RT-Thread Studio 与 STM32CubeMX 下载安装二、新建工程三、点亮LED灯四、按键中断五、串口通信六、OLED显示 前言 软件开发环境:RT-Thread Studio、STM32CubeMX 硬件:STM32F407ZGT6 一、RT-Thread Studio 与 STM32CubeMX 下载安装 …

【C语言数据结构————————二叉树】

文章目录 文章目录 一、什么是树 树的定义 树的种类 树的深度 树的基本术语 二、满二叉树 定义 满二叉树的特点 三、完全二叉树 定义 特点 四、二叉树的性质 五、二叉树的存储结构 顺序存储结构 链式存储结构 六、二叉树的基本操作 七、二叉树的创建 八、二叉树…

电容的作用

文章目录 总结1.降压2.滤波3.延时4.耦合5.旁路电容 总结 1.降压 问题: 直接连接灯泡会烧掉 解决方案 进一步为了防止电容放电,伤人,加入一个大电阻 2.滤波 直流的情况 交流的情况 频率与容抗的关系 3.延时 4.耦合 滤除直流成分&#xf…

Android---动态权限适配问题

在 Android6.0,即 API 23 之前,App 需要的权限都会在安装阶段向用户展示,而在 App 运行期间不需要动态判断权限是否已申请。从 6.0 之后的版本开始,Android 系统做了一次大的改动。对于部分权限,App 需要在代码中动态申…

Visual Studio 2019 写 Unity 脚本时,烦人又离谱的自动补全!

Visual Studio 2019 写 Unity 脚本时,逆天又离谱的自动补全! 血压高升的原因 写脚本的时候,智能提示有哪些函数可以使用,是非常棒的一件事情,有助于游戏开发者编写和检查自己的脚本代码。 但是! 我想输入…

序列化模块-json和pickle

一、json json是所有语言都通用的一种序列化格式 ,只支持 列表、 字典、 字符串、 数字 , 字典的key必须是字符串 1、dumps、loods # 在内存中做数据转换 : # durps 数据类型 转成 字符串 序列化 # loods 字符串 转成 数据类型 反序…

理解快速排序

理解快速排序 首先了解以下快速排序 快速排序(QuickSort)是一种常用的排序算法,属于比较排序算法的一种。它是由英国计算机科学家Tony Hoare于1960年提出的,是一种分而治之(divide and conquer)的算法。 …
最新文章