how2heap-2.23-05-unsorted_bin_attack

先看看unsorted bin的入链和出链情况

#include <malloc.h>int main()
{char* a = malloc(0x88);malloc(0x8);char* b = malloc(0x100);malloc(0x8);free(a);free(b);char* c = malloc(0x88);char* d = malloc(0x100);return 0;
}

分配chunk

char* a = malloc(0x88);
malloc(0x8);
char* b = malloc(0x100);
malloc(0x8);

在这里插入图片描述

chunk a释放到 unsorted bin中

在这里插入图片描述

chunk b释放到unsorted bin中

在这里插入图片描述
简化一下(都是指向的chunk头部
在这里插入图片描述
可以看到,最近释放的chunk与unsorted bin头结点相连

  • unsorted bin中的bk指向最旧的chunk
  • unsorted bin中的fd 指向最新的chunk

从unsorted bin中申请回chunk a

当将一个 unsorted bin 取出的时候,会将 bck->fd 的位置写入本 Unsorted Bin 的位置。

          /* remove from unsorted list */if (__glibc_unlikely (bck->fd != victim))malloc_printerr ("malloc(): corrupted unsorted chunks 3");unsorted_chunks (av)->bk = bck;bck->fd = unsorted_chunks (av);

unsorted bin attack原理确实是这一块的代码,但是大佬讲的言简意赅,下面我会啰嗦一点的讲。


由于是把chunk a申请回来,则unsorted bin链从如下图
在这里插入图片描述
转变为如下图
在这里插入图片描述

需要修正的是:

  • chunk b fd的内容
  • unsorted bin 头节点bk的内容

在malloc.c源码中_int_malloc函数中,要申请的chunk大小在fastbin,small bin中没有现成的chunk满足时,会整理unsorted bin

  • 先将unsorted bin中的chunk一个一个先脱链(怎么脱链不管),但每次脱链unsorted bin链需要将其剩余的所有chunk的fd,bk修正正常
  • 如果脱链的chunk大小和申请的大小相同,就直接使用
  • 否则放入的small bin或者large bin中

unsorted bin attack就发生在chunk脱链,unsorted bin链表重新整理这一步


下面是正常情况,在当前示例中:victim就是chunk a,bck就是chunk b
(如果victim是chunk b,则 bck就是unsorted bin)

In file: /glibc/2.23/source/malloc/malloc.c3468     {3469       int iters = 0;3470       while ((victim = unsorted_chunks (av)->bk) != unsorted_chunks (av))3471         {3472           bck = victim->bk;0// victim是当前检查的chunk,bck是该chunk之后(时间上)放入unsorted bin的chunk// victim理解为chunk a,bck理解为chunk b3473           if (__builtin_expect (victim->size <= 2 * SIZE_SZ, 0)3474               || __builtin_expect (victim->size > av->system_mem, 0))3475             malloc_printerr (check_action, "malloc(): memory corruption",3476                              chunk2mem (victim), av);3477           size = chunksize (victim);

从unsorted bin的bk中,获取最旧的chunk,之后再根据chunk->bk,从最旧到最新开始遍历,尝试在unsorted bin链表中找到合适的chunk


然后chunk a就脱链(怎么脱链,放到哪里的逻辑,在修正的代码之后),unsorted bin和chunk b开始修正其fd,bk,修正的代码就是上面的

          /* remove from unsorted list */if (__glibc_unlikely (bck->fd != victim))malloc_printerr ("malloc(): corrupted unsorted chunks 3");unsorted_chunks (av)->bk = bck;1】bck->fd = unsorted_chunks (av);2
  • 【0】bck就是chunk b,是从bck = victim->bk获取到的
  • 【1】unsorted_chunks (av)->bk = bck;,修正unsorted bin头节点的bk
  • 【2】bck->fd = unsorted_chunks (av);,修正chunk b的fd

在这里插入图片描述

如何产生unsorted bin attack

伪造从unsorted bin链中,要脱链chunk的bk
在这里插入图片描述
unsorted bin attack的效果就是在指定的位置,写入unsorted bin头结点的首地址,就是那个所谓的较大的值。

需要注意的是,虚假的chunk fd必须是一个可写的地址


现在再看how2heap的代码就容易理解一些。

#include <stdio.h>
#include <stdlib.h>int main(){fprintf(stderr, "This file demonstrates unsorted bin attack by write a large unsigned long value into stack\n");fprintf(stderr, "In practice, unsorted bin attack is generally prepared for further attacks, such as rewriting the ""global variable global_max_fast in libc for further fastbin attack\n\n");unsigned long stack_var=0;fprintf(stderr, "Let's first look at the target we want to rewrite on stack:\n");fprintf(stderr, "%p: %ld\n\n", &stack_var, stack_var);unsigned long *p=malloc(400);fprintf(stderr, "Now, we allocate first normal chunk on the heap at: %p\n",p);fprintf(stderr, "And allocate another normal chunk in order to avoid consolidating the top chunk with""the first one during the free()\n\n");malloc(500);free(p);fprintf(stderr, "We free the first chunk now and it will be inserted in the unsorted bin with its bk pointer ""point to %p\n",(void*)p[1]);//------------VULNERABILITY-----------p[1]=(unsigned long)(&stack_var-2);fprintf(stderr, "Now emulating a vulnerability that can overwrite the victim->bk pointer\n");fprintf(stderr, "And we write it with the target address-16 (in 32-bits machine, it should be target address-8):%p\n\n",(void*)p[1]);//------------------------------------malloc(400);fprintf(stderr, "Let's malloc again to get the chunk we just free. During this time, the target should have already been ""rewritten:\n");fprintf(stderr, "%p: %p\n", &stack_var, (void*)stack_var);
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven简介及环境搭建和基本使用(Java开发中的实用工具)

一、概述 Maven 是 Apache 软件基金会的一个开源项目,是一个优秀的项目构建工具,它 用来帮助开发者管理项目中的 jar,以及 jar 之间的依赖关系、完成项目的编译、 测试、打包和发布等工作。 Maven的相关概念 pom.xml文件&#xff1a;里面可以配置相关信息&#xff0c;指导ma…

HttpSession的使用

1 HttpSession 概述 在 Java Servlet API 中引入 session 机制来跟踪客户的状态。session 指的是在一段时间内&#xff0c;单个客户与 Web 服务器的一连串相关的交互过程。在一个 session 中&#xff0c;客户可能会多次请求访问同一个网页&#xff0c;也有可能请求访问各种不同…

JRT实现表格元素

数据结构决定算法基础&#xff0c;良好的设计可以极大的减轻上层的复杂度。以前由于受限M没画笔&#xff0c;都得通过Webservice代理出去&#xff0c;所以实现一些效果比较难。用M控制打印绘制表格就很费劲。但是打印报告结果、药敏等很多都是列表排版。用TextLength控制换行或…

高清网络视频监控平台的应用-城市大交通系统视联网

目 录 一、应用需求 二、系统架构设计 三、功能介绍 1.实时视频监控 2.云台控制 3.语音功能 4. 录像管理与回放 5.告警联动 6.多种显示终端呈现 &#xff08;1&#xff09;CS客户端 &#xff08;2&#xff09;web客户端 &#xff08;3&#xf…

整理的6个Linux运维脚本

整理的6个Linux运维脚本 1、统计/etc/passwd 中能登录的用户&#xff0c;并将对应在/etc/shadow 中第二列密码提取2、查看当前连接到本机的远程IP地址3、检测本机当前用户是否为超级管理员&#xff08;root&#xff09;4、检查指定目录下是否存在对应文件5、查找 Linux 系统中的…

实现线上盲盒购物体验:盲盒商城小程序开发攻略

随着智能手机的普及&#xff0c;移动互联网已经成为人们生活中不可或缺的一部分。在众多的移动应用中&#xff0c;微信小程序以其便捷、简洁的特点备受用户青睐。而在众多的小程序中&#xff0c;盲盒电商小程序正成为下一个爆发点。 盲盒电商是指通过盲盒的形式进行商品销售的一…

设计模式 七大原则

1.单一职责原则 单一职责原则&#xff08;SRP&#xff1a;Single responsibility principle&#xff09;又称单一功能原则 核心&#xff1a;解耦和增强内聚性&#xff08;高内聚&#xff0c;低耦合&#xff09;。 描述&#xff1a; 类被修改的几率很大&#xff0c;因此应该专注…

【TC3xx芯片】TC3xx芯片的GTM模块详解

目录 前言 正文 1.GTM模块功能概述 1.1 GTM具体功能 1.2 GTM架构 2. GTM模块输入时钟 2.1.fGTM的值怎么计算 3. CMU 3.1 CMU功能 3.2 CMU时钟的计算 3..2.1 CLS0_CLK怎么计算 3.2.1 GTM Global Clock时钟计算 3.2.2 分频时钟的计算 4. CCM 4.1 CCM功能 4.2 CCM…

Mysql的四大引擎,账号管理,数据库的建立

数据库存储引擎查看 Support字段说明 default的为默认引擎 YES表示可以使用 NO表示不能使用 命令 SHOW ENGINES 四大引擎 MEMORY 使用场景&#xff1a;由于易失性&#xff0c;可以用于存储在分析中产生的中间表 特点 所有的数据都保存在内存中&#xff0c;一旦服务器重启&…

Spark内核解析-内存管理7(六)

1、Spark内存管理 Spark 作为一个基于内存的分布式计算引擎&#xff0c;其内存管理模块在整个系统中扮演着非常重要的角色。理解 Spark 内存管理的基本原理&#xff0c;有助于更好地开发 Spark 应用程序和进行性能调优。本文中阐述的原理基于 Spark 2.1 版本。 在执行 Spark 的…

ArrayList集合综合练习

文章目录 题目1训练目标训练提示训练步骤参考答案 题目2训练目标训练提示参考方案训练步骤参考答案 题目3训练目标训练提示参考方案训练步骤参考答案 题目4&#xff08;综合&#xff09;训练目标训练提示参考方案训练步骤参考答案 题目1 现有如下字符串元素&#xff1a;[“aaa…

Mysql的基本用法(上)非常详细、快速上手

上篇结束了java基础&#xff0c;本篇主要对Mysql中的一些常用的方法进行了总结&#xff0c;主要对查询方法进行了讲解&#xff0c;包括重要的多表查询用到的内连接和外连接等&#xff0c;以下代码可以直接复制到可视化软件中&#xff0c;方便阅读以及练习&#xff1b; SELECT *…