堆Heap块Chunk

本文深入探讨了堆内存管理,特别是Chunk和Heap的基础知识。介绍了Chunk的分类、堆的基本操作,如malloc和free函数的工作原理,以及堆溢出的概念和利用策略。文章还提到了Fast bin和Unsort bin在堆管理中的作用,以及堆溢出攻击的关键步骤,如寻找堆分配函数、确定填充长度等。
摘要由CSDN通过智能技术生成

0x01 基础知识——Chunk

分配过的chunk

  • 32位机,8字节对齐,64位机,16字节对齐
  • 位P指明前一个chunk的状态(空闲为0,使用为1)
  • prev_size表示前一个chunk的大小
    当前chunk释放时,可用于定位前一个chunk,并将两个chunk合并为一个更大的chunk
    当P为1时,prev_size无意义,该区域(4B)可被前一个chunk使用

在这里插入图片描述

在glibc malloc中将整个堆内存空间分成了连续的、大小不一的chunk,即对于堆内存管理而言chunk就是最小操作单位。

Chunk总共分为4类:
1)allocated chunk; 2)free chunk; 3)top chunk; 4)Last remainder chunk。
从本质上来说,所有类型的chunk都是内存中一块连续的区域,只是通过该区域中特定位置的某些标识符加以区分。为了简便,我们先将这4类chunk简化为2类:allocated chunk以及free chunk,前者表示已经分配给用户使用的chunk,后者表示未使用的chunk。

众所周知,无论是何种堆内存管理器,其完成的核心目的都是能够高效地分配和回收内存块(chunk)。因此,它需要设计好相关算法以及相应的数据结构,而数据结构往往是根据算法的需要加以改变的。

0x02 基础知识——Heap

在程序运行过程中,堆可以提供动态分配的内存允许程序申请大小未知的内存。堆其实就是程序虚拟地址空间的一块连续的线性区域,它由低地址向高地址方向增长。我们一般称管理堆的那部分程序为堆管理器。

堆管理器处于用户程序与内核中间,主要做以下工作

响应用户的申请内存请求,向操作系统申请内存,然后将其返回给用户程序。同时,为了保持内存管理的高效性,内核一般都会预先分配很大的一块连续的内存,然后让堆管理器通过某种算法管理这块内存。只有当出现了堆空间不足的情况,堆管理器才会再次与操作系统进行交互。
管理用户所释放的内存。一般来说,用户释放的内存并不是直接返还给操作系统的,而是由堆管理器进行管理。这些释放的内存可以来响应用户新申请的内存的请求。

0x03 堆的基本操作

1>堆的分配,回收,堆分配背后的系统调用
2>堆目前多线程支持

0x04 堆相关的函数

1>malloc

在 glibc 的 malloc.h 中,malloc 的说明如下

/*
  malloc(size_t n)
  Returns a pointer to a newly allocated chunk of at least n bytes, or null
  if no space is available. Additionally, on failure, errno is
  set to ENOMEM on ANSI C systems.
  If n is zero, malloc returns a minumum-sized chunk. (在大多数32位系统中,最小大小为16字节,在64位上为24字节或32字节。) 
 On most systems, size_t is an unsigned type, so calls
  with negative arguments are interpreted as requests for huge amounts
  of space, which will often fail. The maximum supported value of n
  differs across systems, but is in all cases less than the maximum
  representable value of a size_t.+
*/

可以看出,malloc 函数返回对应大小字节的内存块的指针。此外,该函数还对一些异常情况进行了处理

当 n=0 时,返回当前系统允许的堆的最小内存块。
当 n 为负数时,由于在大多数系统上,size

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值