内存管理中free的行为

本文简要介绍了Linux内存管理中free函数的行为,特别是与堆溢出漏洞利用相关的部分。讨论了内存结构,如chunk的结构和内存分配原理。free操作时,检查前后内存块是否为空并进行unlink操作,通过修改flag和prev_size来更新内存状态。文章还提及了内存管理源码中的unlink宏,分析了其防止溢出的保护机制。

说明

首先,我不是研究linux内核的。所以这篇文章也不会过于深入的探讨linux中有关内存管理的行为。写这篇文章的目的只是为了介绍一下在堆溢出漏洞利用当中可能会涉及到的有关free的一些行为,以及一些相关的检查。

可以在这里看到libc中内存管理的源代码。
malloc.c
那么,我们开始吧

内存结构

首先是申请的内存块在内存中的结构。所有malloc等等函数申请的内存都会被系统申请在一个叫做堆的地方,其实也就是一块比较大的内存。然后当程序需要内存时,系统就会从堆里面找一块还没有被使用的内存出来告诉程序,这一块内存给你用。然后如果你使用了超出你申请范围的内存。如果被系统发现了,会强制结束程序

一般的情况,如果程序连续申请内存的话,操作系统会按次序的在堆里码放内存,一块紧挨着一块。中间没有空隙。打个比方吧,就像一座旅馆一样,所有需要的入住的旅客会老板从0号房开始依次安排下去。

然后如果申请了一大堆内存块,然后将其中的某几块给释放掉的。就像旅店里面有几间房子的人离开了一样,这个时候老板需要知道哪几间房子是空的,以便让新来的人住进去。

那么操作系统是怎么知道那些内存被释放了呢?先看看内存中chunk的结构吧
复制自glibc中源码,并翻译了注释

struct malloc_chunk {
  INTERNAL_SIZE_T      prev_size;  /* 前一个chunk的大小 (如果前一个已经被free)*/
  INTERNAL_SIZE_T      size;       /* 字节表示的chunk大小,包括chunk头       */
  struct malloc_chunk* fd;         /* 双向链表 -- 只有在被free后才存在       */
  struct malloc_chunk* bk;
};

解释一下,这里的的结构是chunk头部分的内容。在内存块free之前,最后两个指针是不存在的,只有前2项的内容。然后在第二项之后就是可供程序使用的

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值