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 的chunk1ptr2=malloc(0x10);//分配第1个 0x10 的chunk1ptr3=malloc(0x10);//分配第1个 0x10 的chunk1ptr4=malloc(0x10);//分配第1个 0x10 的chunk1ptr5=malloc(0x10);//分配第1个 0x10 的chunk1ptr6=malloc(0x10);//分配第1个 0x10 的chunk1ptr7=malloc(0x10);//分配第1个 0x10 的chunk1ptr8=malloc(0x10);//分配第1个 0x10 的chunk1free(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 的chunk1ptr2=malloc(0x80);//分配第1个 0x80 的chunk1ptr3=malloc(0x80);//分配第1个 0x80 的chunk1ptr4=malloc(0x80);//分配第1个 0x80 的chunk1ptr5=malloc(0x80);//分配第1个 0x80 的chunk1ptr6=malloc(0x80);//分配第1个 0x80 的chunk1ptr7=malloc(0x80);//分配第1个 0x80 的chunk1ptr8=malloc(0x80);//分配第1个 0x80 的chunk1free(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);elseassert (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的chunkptr2=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 的chunk1ptr2=malloc(0x10); //分配第二个 0x10 的chunk2ptr3=malloc(0x10); //防止与top chunk合并*(int *)(ptr-0x8)=0xb1; //此时覆盖后的下一个chunk为ptr3free(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的chunk1ptr2=malloc(0x10);//分配第二个0x10的chunk2free(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);//smallbin1ptr2=malloc(0x10);//fastbin1ptr3=malloc(0x10);//fastbin2ptr4=malloc(128);//smallbin2ptr5=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进行前向extendptr6=malloc(0x150);//得到extend的chunkprintf("控制的地址为:%p",ptr6);
}

先free,再修改header,再malloc

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

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

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

相关文章

Filter简单了解

1、filter能干嘛 过滤器实际上就是对web资源进行拦截&#xff0c;做一些处理后交给下一个过滤器或者servlet处理&#xff0c;通常都是拦截request的&#xff0c;也可以对response进行拦截处理&#xff1b; 2、面试考点&#xff1a;filter能干嘛&#xff08;应用场景&#xff0…

多维时序 | Matlab实现CNN-GRU-Mutilhead-Attention卷积门控循环单元融合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现CNN-GRU-Mutilhead-Attention卷积门控循环单元融合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现CNN-GRU-Mutilhead-Attention卷积门控循环单元融合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍…

退出微软账号,edge/必应退出账号

微软账号退出&#xff1a;搜的教程都是说改成本地帐号&#xff0c;但是我的已经是本地帐号&#xff0c;操作没用。 但是找到了退出edge/必应浏览器账号的方法&#xff0c;见下图。 参考链接&#xff1a;奶酪真好次个人动态-奶酪真好次动态记录-哔哩哔哩视频 (bilibili.com)

【Linux】基本指令收尾

文章目录 日期查找打包压缩系统信息Linux和Windows互传文件 日期 这篇是基本指令的收尾了&#xff0c;还有几个基本指令我们需要说一下 首先是Date&#xff0c;它是用来显示时间和日期 直接输入date的话显示是有点不好看的&#xff0c;所以我们可以根据自己的喜欢加上分隔符&…

使用 Vector 在 Kubernetes 中收集日志

多年来&#xff0c;我们一直在使用 Vector 在我们的 Kubernetes 平台中收集日志&#xff0c;并成功地将其应用于生产中以满足各种客户的需求&#xff0c;并且非常享受这种体验。因此&#xff0c;我想与更大的社区分享它&#xff0c;以便更多的 K8s 运营商可以看到潜力并考虑他们…

【 CSS 】基础1

“坚持就是胜利。” - 温斯顿丘吉尔 【 CSS 】基础 1 CSS 简介 CSS 是层叠样式表 ( Cascading Style Sheets ) 的简称.有时我们也会称之为 CSS 样式表或级联样式表。CSS 也是一种标记语言CSS 主要用于设置 HTML 页面中的文本内容&#xff08;字体、大小、对齐方式等&#xff…

Python使用gRPC入门,定义proto文件和收发消息

gRPC 一开始由 google 开发&#xff0c;是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。 本文通过一个简单的 Hello World 例子来向您介绍 gRPC 。 Grpc官方文档地址&#xff1a;Quick start | Python | gRPC gRPC 是什么&#xff1f; gRPC 也是基于以下理念&#…

Python武器库开发-武器库篇之Quake360-API使用(四十七)

Python武器库开发-武器库篇之Quake360-API使用(四十七) Quake360是一款网络资产搜索引擎&#xff0c;旨在帮助用户快速定位和识别网络上的资产信息。它具有强大的搜索功能&#xff0c;可以搜索并展示各种类型的网络资产&#xff0c;包括域名、IP地址、子域名、端口信息等。同时…

Unity编程#region..#endregion以及面板提示语标签[Tooltip(““)]

C#中的#region..#endregion 在Unity中&#xff0c;#region和#endregion是用于代码折叠的预处理指令。它们并不是Unity特有的&#xff0c;而是C#语言本身提供的功能。 #region用于标记一段代码的开始&#xff0c;而#endregion用于标记一段代码的结束。在编辑器中&#xff0c;可…

橡木桶陈酿:木材选择、烤制程度与陈酿时间

在威士忌的酿造过程中&#xff0c;橡木桶陈酿是一个至关重要的环节。橡木桶不仅为威士忌提供了特别的香气和风味&#xff0c;还赋予其丰富的颜色和味蕾。本文将深入探讨橡木桶陈酿的奥秘&#xff0c;特别是木材选择、烤制程度以及陈酿时间对威士忌风味的影响&#xff0c;以雷盛…

【Linux】解决普通用户无法进行sudo提权

当某个普通用户进行sudo指令提权的时候&#xff0c;可能存在无法操作的问题&#xff0c;如下图&#xff1a; 这个图中有一个细节&#xff0c;我们使用sudo进行提权的时候&#xff0c;用的可是zhangsan的密码&#xff0c;因此有人可能会有疑问&#xff0c;这不是有问题吗&#x…

安泰电子电压放大器的三个特性是指什么

电压放大器是一种主要用于将输入电压信号放大的电子器件。它的工作原理是通过增加电压信号的幅度&#xff0c;使得输出信号比输入信号有更大的电压差。电压放大器通常具有许多特性&#xff0c;其中三个主要特性包括增益、带宽和线性度。 增益是电压放大器最重要的特性之一。增益…

RabbitMQ-消息延迟

一、死信交换机 1、描述 一个队列接收到的消息有过期时间&#xff0c;消息过期之后&#xff0c;如果配置有死信队列&#xff0c;消息就会进去死信队列。 2、图解 3、过程 当生产者将消息发送到exchange1&#xff0c;然后交换机将消息路由到队列queue1&#xff0c;但是队列que…

JavaScript进阶:WebAPIs重点知识整理1

目录 1 DOM修改元素内容 2 DOM修改元素常见属性 3 修改元素样式属性 3.1 通过style修改元素样式 3.2 通过类名className修改元素样式 3.3 通过classList修改元素样式 4 操作表单元素属性 5 自定义属性 6 定时器 7 事件监听 7.1 点击事件 click 7.2 鼠mouseenter和移…

【Linux】权限 !

Linux 权限 Liunx Linux 权限1 什么是权限1.1 Linux用户1.2 切换用户 2 权限管理2.1 文件访问者的分类2.2 文件类型和访问权限2.3 文件权限的设置方法chmod 命令chown 命令chgrp 命令umask 命令file 指令 2.4 目录权限粘滞位 3 权限总结 1 什么是权限 关于Linux的权限问题&…

项目风险管理

风险分类&#xff1a; 分类性质&#xff1a;纯粹风险&#xff0c;投机风险---对应火灾&#xff0c;股票买卖 产生原因&#xff1a;自然&#xff0c;社会&#xff0c;政治&#xff0c;经济&#xff0c;技术 风险性质&#xff1a;客观性&#xff0c;偶然性&#xff0c;相对性&a…

28个炫酷的纯CSS特效动画示例(含源代码)

CSS是网页的三驾马车之一&#xff0c;是对页面布局的总管家&#xff0c;2024年了&#xff0c;这里列出28个超级炫酷的纯CSS动画示例&#xff0c;让您的网站更加炫目多彩。 文章目录 1. 涌动的弹簧效果2. 超逼真的3D篮球弹跳&#xff0c;含挤压弹起模态3. 鼠标放div上&#xff0…

基于ICEEMDAN-SpEn(样本熵)联合小波阈值去噪

代码原理 以样本熵为阈值的ICEEMDAN&#xff08;Incomplete Ensemble Empirical Mode Decomposition with Adaptive Noise&#xff09;联合小波阈值去噪是一种信号处理方法&#xff0c;用于去除信号中的噪声。它结合了ICEEMDAN分解和小波阈值去噪方法。 以下是该方法的步骤&a…

MySQL---多表分组查询综合练习

创建dept表 CREATE TABLE dept ( deptno INT(2) NOT NULL COMMENT 部门编号, dname VARCHAR (15) COMMENT 部门名称, loc VARCHAR (20) COMMENT 地理位置 ); 添加dept表主键 mysql> alter table dept add primary key(deptno); Query OK, 0 rows affected (0.02 s…

CPMS靶场练习

关键&#xff1a;找到文件上传点&#xff0c;分析对方验证的手段 首先查看前端发现没有任何上传的位置&#xff0c;找到网站的后台&#xff0c;通过弱口令admin 123456可以进入 通过查看网站内容发现只有文章列表可以进行文件上传&#xff1b;有两个图片上传点 图片验证很严格…