CTF-PWN-堆-【chunk extend/overlapping-1】

文章目录

  • chunk extend/overlapping
    • fastbin与topchunk相邻free时候不会合并
    • unsortedbinchunk中与topchunk相邻的被free时会合并
    • extend向后overlapping
      • 先修改header,再free,再malloc
      • 先free,再修改header,再malloc
    • extend向前overlapping
      • 利用放入unsorted bin之前的合并机制
      • 先修改header,再free,再malloc
      • 先free,再修改header,再malloc

chunk extend/overlapping

其实就是使得得到chunk的大小扩大,从而能够覆盖到原本不属于本chunk的内存部分(覆盖其他chunk)。从而控制写该部分内存的内容

条件:可修改chunk header的数据,修改后有再次mallloc申请对应修改后对应在bin的chunk的机会,这样才能使得修改有用最终实现扩展chunk范围

fastbin与topchunk相邻free时候不会合并

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdint.h>
int main()
{
    void *ptr1,*ptr2,*ptr3,*ptr4,*ptr5,*ptr6,*ptr7,*ptr8,*ptr9;

    ptr1=malloc(0x10);//分配第1个 0x10 的chunk1
	ptr2=malloc(0x10);//分配第1个 0x10 的chunk1
	ptr3=malloc(0x10);//分配第1个 0x10 的chunk1
	ptr4=malloc(0x10);//分配第1个 0x10 的chunk1
	ptr5=malloc(0x10);//分配第1个 0x10 的chunk1
	ptr6=malloc(0x10);//分配第1个 0x10 的chunk1
	ptr7=malloc(0x10);//分配第1个 0x10 的chunk1
	ptr8=malloc(0x10);//分配第1个 0x10 的chunk1

    free(ptr1);
	free(ptr2);
	free(ptr3);
	free(ptr4);
	free(ptr5);
	free(ptr6);
	free(ptr7);
	free(ptr8);

}

结果
在这里插入图片描述

unsortedbinchunk中与topchunk相邻的被free时会合并

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdint.h>
int main()
{
    void *ptr1,*ptr2,*ptr3,*ptr4,*ptr5,*ptr6,*ptr7,*ptr8,*ptr9;

    ptr1=malloc(0x80);//分配第1个 0x80 的chunk1
	ptr2=malloc(0x80);//分配第1个 0x80 的chunk1
	ptr3=malloc(0x80);//分配第1个 0x80 的chunk1
	ptr4=malloc(0x80);//分配第1个 0x80 的chunk1
	ptr5=malloc(0x80);//分配第1个 0x80 的chunk1
	ptr6=malloc(0x80);//分配第1个 0x80 的chunk1
	ptr7=malloc(0x80);//分配第1个 0x80 的chunk1
	ptr8=malloc(0x80);//分配第1个 0x80 的chunk1

    free(ptr1);
	free(ptr2);
	free(ptr3);
	free(ptr4);
	free(ptr5);
	free(ptr6);
	free(ptr7);
	free(ptr8);

}

在这里插入图片描述

extend向后overlapping

此时是修改size较大,从而使得chunk内容范围扩大,从而能覆盖到高地址的内容
具体可以分先修改size再free,再malloc和先free,再修改,再malloc两个类型

此时注意源码中的各个检测

此时是fastbin libc2.23的源码,此时是malloc时候的源码

  if ((unsigned long) (nb) <= (unsigned long) (get_max_fast ()))
    {
      idx = fastbin_index (nb);
      mfastbinptr *fb = &fastbin (av, idx);
      mchunkptr pp = *fb;
      do
        {
          victim = pp;
          if (victim == NULL)
            break;
        }
      while ((pp = catomic_compare_and_exchange_val_acq (fb, victim->fd, victim))
             != victim);
      if (victim != 0)
        {*/
          if (__builtin_expect (fastbin_index (chunksize (victim)) != idx, 0))
            {
              errstr = "malloc(): memory corruption (fast)";
            errout:
              malloc_printerr (check_action, errstr, chunk2mem (victim), av);
              return NULL;
            }
          check_remalloced_chunk (av, victim, nb);
          void *p = chunk2mem (victim);
          alloc_perturb (p, bytes);
          return p;
        }
    }

检查函数


static void
do_check_remalloced_chunk (mstate av, mchunkptr p, INTERNAL_SIZE_T s)
{
  INTERNAL_SIZE_T sz = p->size & ~(PREV_INUSE | NON_MAIN_ARENA);

  if (!chunk_is_mmapped (p))
    {
      assert (av == arena_for_chunk (p));
      if (chunk_non_main_arena (p))
        assert (av != &main_arena);
      else
        assert (av == &main_arena);
    }

  do_check_inuse_chunk (av, p);

  /* Legal size ... */
  assert ((sz & MALLOC_ALIGN_MASK) == 0);
  assert ((unsigned long) (sz) >= MINSIZE);
  /* ... and alignment */
  assert (aligned_OK (chunk2mem (p)));
  /* chunk is less than MINSIZE more than request */
  assert ((long) (sz) - (long) (s) >= 0);
  assert ((long) (sz) - (long) (s + MINSIZE) < 0);
}

do_check_inuse_chunk (av, p);函数

static void
do_check_inuse_chunk (mstate av, mchunkptr p)
{
  mchunkptr next;

  do_check_chunk (av, p);

  if (chunk_is_mmapped (p))
    return; /* mmapped chunks have no next/prev */

  /* Check whether it claims to be in use ... */
  assert (inuse (p));

  next = next_chunk (p);

  /* ... and is surrounded by OK chunks.
     Since more things can be checked with free chunks than inuse ones,
     if an inuse chunk borders them and debug is on, it's worth doing them.
   */
  if (!prev_inuse (p))
    {
      /* Note that we cannot even look at prev unless it is not inuse */
      mchunkptr prv = prev_chunk (p);
      assert (next_chunk (prv) == p);
      do_check_free_chunk (av, prv);
    }

  if (next == av->top)
    {
      assert (prev_inuse (next));
      assert (chunksize (next) >= MINSIZE);
    }
  else if (!inuse (next))
    do_check_free_chunk (av, next);
}

先修改header,再free,再malloc

对于fastbin
修改可free至faastbin的chunk的size大小,使其覆盖下一个目标chunk,free后再malloc可得到覆盖目标chunk的大chunk

#include<stdio.h>
#include <stdlib.h>

int main(void)
{
    void *ptr,*ptr1,*ptr2;

    ptr=malloc(0x10);//分配第一个0x10的chunk

    ptr2=malloc(0x10);//分配第二个0x10的chunk
    //free(ptr2)不影响后面的extend
    *(long long *)((long long)ptr-0x8)=0x41;// 修改第一个块的size域

    free(ptr);
    ptr1=malloc(0x30);// 实现 extend,控制了第二个块的内容
    printf("控制的地址:%p",ptr1);
    return 0;
}

此时修改0x41的1是pre_inuse位,因为此时为1方便绕过检查,此时
在这里插入图片描述

对于不属于fastbin
当free一个不属于fastbin的的chunk,并且该chunk不与topchunk相邻,该chunk会被首先放到unsortedbin中。修改其size大小,使其覆盖下一个目标chunk,free后再malloc可得到覆盖目标chunk的大chunk

#include<stdio.h>

#include <stdlib.h>
int main()
{
    void *ptr,*ptr1,*ptr2,*ptr3;

    ptr=malloc(0x80);//分配第一个 0x80 的chunk1
    ptr2=malloc(0x10); //分配第二个 0x10 的chunk2
    ptr3=malloc(0x10); //防止与top chunk合并

    *(int *)(ptr-0x8)=0xb1; //此时覆盖后的下一个chunk为ptr3
    free(ptr);
    ptr1=malloc(0xa0);
    printf("控制的地址为:%p",ptr1);
}

在这里插入图片描述

先free,再修改header,再malloc

对于fastbin
由于free后malloc取出的chunk会检查size是否正确,如果此时被修改将会报错,所以不行

对于不属于fastbin
当free一个不属于fastbin的的chunk,并且该chunk不与topchunk相邻,该chunk会被首先放到unsortedbin中。先free,然后修改该chunksize大小,最后再次申请即可覆盖

#include<stdio.h>
#include <stdlib.h>
int main()
{
    void *ptr,*ptr1,*ptr2,*ptr3;

    ptr=malloc(0x80);//分配第一个0x80的chunk1
    ptr2=malloc(0x10);//分配第二个0x10的chunk2

    free(ptr);//首先进行释放,使得chunk1进入unsorted bin

    *(int *)(ptr-0x8)=0xb1;
    ptr1=malloc(0xa0);
    printf("控制的地址为:%p",ptr1);
}
    

extend向前overlapping

利用放入unsorted bin之前的合并机制

前向 extend 利用了 然后再将合并chunk放到unsorted bin中(不能与topchunk相邻),通过修改 pre_size 域可以跨越多个 chunk (即根据pre_size和pre_inuse确定的前一个chunk可能实际涵盖了多个实际的chunk)进行合并实现 overlapping。

通过修改当前chunk的pre_inuse和pre_size,当free当前chunk时,会根据pre_size和pre_inuse确定的前一个chunk的地址可是否free,如果是pre_inuse为0从而实现合并

先修改header,再free,再malloc

#include<stdio.h>
#include <stdlib.h>
int main(void)
{
    void *ptr1,*ptr2,*ptr3,*ptr4,*ptr5,*ptr6;
    ptr1=malloc(128);//smallbin1
    ptr2=malloc(0x10);//fastbin1
    ptr3=malloc(0x10);//fastbin2
    ptr4=malloc(128);//smallbin2
    ptr5=malloc(0x10);//防止与top合并
    free(ptr1);//使得下个chunk对应的前一个chunk是free的
    *(int *)((long long)ptr4-0x8)=0x90;//修改pre_inuse域
    *(int *)((long long)ptr4-0x10)=0xd0;//修改pre_size域
    free(ptr4);//unlink进行前向extend
    ptr6=malloc(0x150);//得到extend的chunk
    printf("控制的地址为:%p",ptr6);
}

先free,再修改header,再malloc

没用,因为free时才会合并,如果先free后再修改,那么将不会有任何合并操作

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

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

相关文章

【UEFI基础】EDK网络框架(TCP4)

TCP4 TCP4协议说明 相比UDP4&#xff0c;TCP4是一种面向连接的通信协议&#xff0c;因此有更好的可靠性。 TCP4的首部格式如下&#xff1a; 各个参数说明如下&#xff1a; 字段长度&#xff08;bit&#xff09;含义Source Port16源端口&#xff0c;标识哪个应用程序发送。D…

如何在 Ubuntu 22.04 上安装 Linux、Apache、MySQL、PHP (LAMP) 堆栈

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 如何在 Ubuntu 22.04 上安装 Linux、Apache、MySQL、PHP (LAMP) 堆栈 介绍 “LAMP”堆栈是一组开源软件&#…

Linux之进程管理篇(1)

初识进程 1.1 进程 进程&#xff1a;是具有独立功能的一次运行过程&#xff0c;是系统进行资源分配和调度的基本单位。Linux创建新进程时会为其指定和一个唯一的号码&#xff0c;即进程号(PID),以此区别不同的进程。进程不是程序&#xff08;程序&#xff1a;执行特定任务的一…

Istio

1、Istio介绍 Istio 是由 Google、IBM 和 Lyft 开源的微服务管理、保护和监控框架。 官网&#xff1a;https://istio.io/latest/zh/ 官方文档&#xff1a;https://istio.io/docs/ 中文官方文档&#xff1a;https://istio.io/zh/docs Github地址&#xff1a;https://github.com…

Kubernetes/k8s之包管理器helm

helm 在没有helm之前&#xff0c;我们要部署一个服务&#xff0c;deployment、service ingress 的作用通过打包的方式。把deployment、service ingress打包在一块&#xff0c;一键式部署服务。类似于yum功能。是官方提供的类似安装仓库的功能&#xff0c;可以实现一键化部署应…

Python量化交易- mplfinance库 -画K线图

mplfinance库 1. mplfinance 模块说明2. mplfinance安装3. mplfinance 模块 plot 基本用法参数typestylemake_addplot设置图表颜色 make_marketcolors添加图表样式 make_mpf_style 4. mplfinance 的基本K线图实现自定义风格和颜色图表尺寸调整、相关信息的显示添加完整移动平均…

C语言爬虫程序编写的爬取APP通用模板

互联网的飞快发展&#xff0c;尤其是手机终端业务的发展&#xff0c;让越来越多的事情都能通过手机来完成&#xff0c;电脑大部分的功能也都能通过手机实现&#xff0c;今天我就用C语言写一个手机APP类爬虫教程&#xff0c;方便后期拓展APP爬虫业务。而且这个模板是通用的适合各…

SIP12 脚模块式单路交流信号隔离变送器0~1VAC/0~5VAC转4-20mA/0-5VDC

概述&#xff1a; IPO AC系列模块式交流电压隔离变送器&#xff0c;能将输入的交流信号按比例转换成4~20mA标准信号, 输入为0~1Vrms等交流电压信号&#xff1b;输出为4~20mA直流电流信号或0~5VDC直流电压信号。实现辅助电源和输入输出信号之间2500VDC隔离&#xff0c;输入信号…

DevOps系列文章之 GitLab CI/CD

CICD是什么? 由于目前公司使用的gitlab&#xff0c;大部分项目使用的CICD是gitlab的CICD&#xff0c;少部分用的是jenkins&#xff0c;使用了gitlab-ci一段时间后感觉还不错&#xff0c;因此总结一下 介绍gitlab的CICD之前&#xff0c;可以先了解CICD是什么 我们的开发模式…

力扣刷MySQL-第五弹(详细讲解)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;力扣刷题讲解-MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出…

超级菜鸟怎么学习数据分析?

如果你有python入门基础&#xff0c;在考虑数据分析岗&#xff0c;这篇文章将带你了解&#xff1a;数据分析人才的薪资水平&#xff0c;数据人应该掌握的技术栈。 首先来看看&#xff0c;我在搜索数据分析招聘时&#xff0c;各大厂开出的薪资&#xff1a; 那各大厂在数据领域…

【Spring 篇】MyBatis多表操作:编织数据的交响乐

欢迎来到MyBatis的多表操作世界&#xff01;在这个充满交响乐的舞台上&#xff0c;我们将探索如何巧妙地编织多个数据表的数据&#xff0c;创造出一场旋律动听的数据交响曲。无需繁琐的SQL拼接&#xff0c;MyBatis让多表操作变得优雅而简单。让我们一起进入这个音乐殿堂&#x…

二.Winform使用Webview2在Demo1中实现地址简单校验

Winform使用Webview2在Demo1中实现地址简单校验 往期目录回顾添加对于的简单url验证提示通过上节和本节涉及到的函数有 往期目录 往期相关文章目录 专栏目录 回顾 通过一.Winform使用Webview2(Edge浏览器核心) 创建demo(Demo1)实现回车导航到指定地址 我们已经知道了解决资源…

裁员背景下 | 【2024年人生的里程碑】作为独立开发者,第一次承接外包项目的心得经历,也许说出你的心声哦!

&#x1f6aa; 每日一句 种子不落在肥土而落在瓦砾中&#xff0c;有生命力的种子决不会悲观和叹气&#xff0c;因为有了阻力才有磨炼。 背景介绍 在裁员背景下&#xff0c;寻找自主承包项目成为了一种可行且具有吸引力的选择。对于职业技术人员而言&#xff0c;自主承包项目不…

【服务器】Xshell与Xftp软件的使用指南

目录 【Xshell软件】 1.1 Xshell软件的功能 1.2 Xshell软件的使用 【Xftp软件】 2.1 Xftp软件的功能 2.2 Xftp软件的使用 可替代产品【FinalShell】 3.1 FinalShell软件的使用 3.2 FinalShell连接服务器失败解决方法 可替代产品【FileZilla】

暴力破解常见的服务器

目录 使用 pydictor 生成自己的字典工具liunx下载使用常用的参数说明插件型字典 (可自己根据 API 文档开发) 使用 hydra 工具在线破解系统用户密码使用 hydra 破解 windows 7 远程桌面密码使用 hydra 工具破解 ssh 服务 root 用户密码 使用 Medusa 工具在线破解medusa参数说明M…

STM32之RTC实时时钟

一、实时时钟概述 1、实时时钟介绍 英文缩写&#xff1a;RTC。显示年、月、日、时、分、秒、星期,自动计算闰年&#xff0c;能够区分每个月的天数。 RTC特点&#xff1a;能从RTC获取到具体的日期时间&#xff0c;断掉后再开机时间仍然准确&#xff08;需要纽扣电池&#xff…

JSON简单了解

文章目录 1、JSON介绍2、ES6模版字符串3、JS对象转化为JSON字符串3.1、手动JS对象转化为JSON字符串3.2、自动JS对象转化为JSON字符串 4、JS对象和java互相转换 1、JSON介绍 JSON 概念&#xff1a;JavaScript Object Notation。JavaScript 对象表示法&#xff0c;简单理解JSON是…

如何控制项目管理中的日程冲突?

《全球公司生产力报告》发现&#xff0c;62% 的公司领导表示&#xff0c;资源调度是他们在项目管理方面面临的最大挑战。其中&#xff0c;日程冲突是利用共享资源池管理多个项目的典型挑战。例如&#xff0c;团队成员参与的活动可能会重叠&#xff0c;也可能是任务分配给了无法…

设计模式篇---中介者模式

文章目录 概念结构实例总结 概念 中介者模式&#xff1a;用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互。 就好比世界各个国家之间可能会产生冲突&#xff0c;但是当产…