Malloc碎碎念

(以前为给同学分享写的点东西,很基础。)现在的比赛中堆溢出非常常见,对于glibc下malloc的理解也要深入一些。

malloc_chunk的对齐属性

在glibc中,malloc_chunk以 2*sizeof(size_t)对齐,在32位系统中以8字节对齐,在64位系统中一般以16字节对齐。Malloc_chunk的定义如下:

既然malloc_chunk以2*sizeof(size_t)对齐,那么malloc返回给用户的指针数值也是以2*sizeof(size_t)对齐。

Glibc中最小的chunk是多大呢?

最小的chunk需要保证能放下prev_size、size、fd以及bk字段并保证对齐。在32位系统中,即16字节,在64位系统中,一般为32字节。在64位系统中也可能定义INTERNAL_SIZE_T也即size_t为4字节,这种情况下最小的chunk位24字节。如下:

Fastbin里有多少bin呢?

将上面的宏计算出来,会发现NFASTBINS为10,不论32位系统还是64位系统。

Fastbin里chunk的大小范围呢?

在32位系统中,fastbin里相邻的两个bin大小差距8个字节;在64位系统中,则是差距16个字节。

既然有10个fastbin,在32位系统中,fastbin的chunk的范围是从16,24,32,...,88字节吗?不对!在malloc_init_state函数中,会将fastbin最大的chunk设置为64,并没有达到88。

因此,在32位系统中,fastbin里chunk的大小范围从16到64;在64位系统中,fastbin里chunk的大小范围从32到128。

Small bins里chunk大小范围?有多少bins?

在32位系统中,small bins里的chunk大小从16到504字节;在64位系统中,small bins里的chunk大小从32到1016字节。

根据small bins里的chunk大小范围以及每个chunk递增的大小得知,small bins里有62个bin。

怎么根据p=malloc(m)里的m来判断分配多大的chunk呢?

将申请的内存大小加上每个chunk的overhead,也就是chunk结构体里的size字段。然后对齐,就是需要分配的chunk的大小。

举个例子:

在64位系统中,确定chunk的大小为0x88+0x8=0x90。所以每一次申请,都会分配一个大小为0x90的chunk。

返回的一个chunk大小为0x90,除了pre_size和size,还剩下0x80大小的区域,你会想"什么?我申请了0x88的大小,却返回了一个0x80大小的内存?"其实这些chunk都是虚拟出来的,正常情况下可以使用的内存包括下一个chunk的pre_size字段,所以申请了0x88的大小,还是可以使用到0x88大小的内存的。

时间: 2024-12-18 18:31:29

Malloc碎碎念的相关文章

有关于二进制漏洞和利用的碎碎念

有关于二进制漏洞和利用的碎碎念 划水作品 偷闲记录一下二进制方面的各种概念,各种原理,各种利用等等,方便过后查阅,也为之后的学习路线列一个大的框架,主要内容还是针对CTF中的pwn,实际漏洞也有这些方面,不过就需要花更多的精力慢慢硬磕了. 栈溢出 由于种种原因,这是本人学习时间最长的一种漏洞,学的时候还有乌云,学完... 栈溢出原理很简单,就是栈上的数据没有合理的被控制,从而使得输入数据超出它本应该在的范围,越界少的可能只是局部变量覆盖,多的就是劫持控制流,不同情况造成不同的后果. 栈溢出是二进

有关Linux软件开发的碎碎念

2020-03-23 关键字: 在Linux外设开发时,用于CPU与外设之间通信的方式主要有以下三种: 1.轮询 2.中断 3.DMA 1.轮询 轮询法是最简单的通信方式.它仅需要开一个无限循环来不断地查询要通信的外设的状态,从而决定是否与之通信.其极为简单的开发方式所带来的后果就是它非常消耗CPU资源,程序效率较为低下. 2.中断 中断的通信方式就是轮询法的改进版本.它既兼顾了通信及时性又很好的照顾了系统资源消耗.当使用中断方式通信时,外设在相应的状态发生变化时就会使CPU产生一个中断信号,根

工作中的感悟 (三)三个月碎碎念篇

感慨一下来这里工作已经有一个月了,从最初的不是很适应这里的节奏,到慢慢适应了这里的生活,中间的过程就像经过一场暴风雨的洗礼虽然说的有点夸张,但是也是差不多吧,同在学校比要累很多,不过坚信不管再累.也要坚持既然有人有干,那我们就可以干我们没有什么理由坚持不了.别人可以做到的我们一样可以做到. 刚来的时候以一种无所谓.既兴奋又有很多好奇的心态来到了北京,这里很多人梦想的地方,不禁感慨以后我也在北京这里开始了这里的生活,时间长了究竟会是怎样一种心境呢,据说这里压力大.这里消费高.这里租房忒别烦人,来到

一些关于Linux入侵应急响应的碎碎念

近半年做了很多应急响应项目,针对黑客入侵.但疲于没有时间来总结一些常用的东西,寄希望用这篇博文分享一些安全工程师在处理应急响应时常见的套路,因为方面众多可能有些杂碎. 个人认为入侵响应的核心无外乎四个字,顺藤摸瓜.我们常常需要找到比较关键的信息后通过一些指令查询或者分析日志,逐步分析黑客的具体步骤. 入侵后需要被关注的Linux系统日志 var/log/cron 记录crontab命令是否被正确的执行,一般会被黑客删除 var/log/lastlog 记录登录的用户,可以使用命令lastlog查

【碎碎念】百度前端技术学院春季班

早上迷迷糊糊被读研阶段的室友的微信叫醒了,邀约组队参加百度前端技术学院春季班(http://ife.baidu.com/),前室友在前端方面还是有一定造诣的,自己本身对前端开发又有一定兴趣,因此准备组团参与下. 想想我的技能树长得确实有点奇葩,最早是做嵌入式的,做了三个月点唱机跑去做产品和实施,跑完了大半个福州高校做某系统推广与实施后觉得做开发的童鞋的Bug有点多就边实施边改代码,久而久之就慢慢转向了开发,想想读研阶段白天上班写C#晚上下班写实验室的Java横向项目的经验也是蛮奇葩的,导致现在我

碎碎念

最近心情莫名的低落,明天就要上班了,希望紧张的生活节奏能让我的生活充实起来. 碎碎念,布布扣,bubuko.com

Oracle碎碎念

1. 设置SQL*Plus提示符 SQL> set sqlprompt "_user'@'_connect_identifier>" [email protected]> 为了对所有的SQL*Plus会话自动设置sqlprompt,将上面的命令放置在ORACLE_HOME/sqlplus/admin目录中的glogin.sql文件内 2. 查看角色RESOURCE被授予的系统权限 SQL> select * from dba_sys_privs where gr

Suse碎碎念

1. 如何查看Suse的版本号 vmpbos01:~ # lsb_release -d Description: SUSE Linux Enterprise Server 11 (x86_64) Suse碎碎念,布布扣,bubuko.com

OCS 2007与Lync 2013的一点碎碎念

最近的项目,跨度都比较大.这次碰上的是OCS2007升级Lync 2013.以下记录一些过程心得(吐槽),类似那篇<2003到2012>的博文. 最开始的计划是OCS2007(不带R2)全部推倒干净,然后启Lync2013.商量来商量去,怕推不干净的话,Lync2013部署会有问题.于是就想着OCS2007迁到R2再迁到Lync2013. 这时候一个非常屌的问题出现了! 原有OCS2007是企业版带有后端数据库,客户对于Lync2013企业版的价格有点唏嘘,需求也不高遂只要用标准版-那么-标准

工作一周年碎碎念

去年7月3日入职公司到现在,马上就要一周年了,觉得有必要写篇文章唠叨下. 期间在部门内转了一次组(那次换组可以看我之前那篇入职一个半礼拜写的文章,当时其实蛮失意的),现在又马上要转去另一个部门,自我评价算是比较爱折腾的:),可能比较好的做法是卡下述职评级时间再考虑换岗,哈哈.我在考虑换个环境的时候,单纯就是冲着技术方向和氛围走的,其实现在组里的同事.经理都非常nice,关系也蛮融洽,工作强度也不强,除了项目之外也腾得出自己的时间,照理说没必要换部门.但是总体感觉现在工作氛围有点轻松,技术氛围离我