码迷,mamicode.com
首页 > 其他好文 > 详细

从源头看堆溢出——malloc与free

时间:2016-07-06 20:07:14      阅读:588      评论:0      收藏:0      [点我收藏+]

标签:

  有关于linux下堆利用的文章有很多,之前我也曾总结过,但是并没有深入的追究。这次从源头入手来分析为什么会被利用,怎么被利用。所谓的源头就是堆管理机制,更详细的说就是libc.so中的mallc()与free()函数了。

  目录

  0x0 堆存在的意义

  0x1 找到堆管理函数

  0x0 堆存在的意义

  首先说下堆机制,说白了堆只是一种用户态的内存管理机制而已。设立堆管理机制是为了提高内存的使用的效率,如果没有堆可不可以?当然也是可以的,只是每次需要分配内存时都需要从新用mmap(或类似功能的内核操作)在虚拟地址空间中划拨,每次要释放时还需要再划拨回去。我没有研究过linux的内核中的内存管理机制,但是对于windows来说可以概括成这样:windows使用vad来描述一个进程的虚拟地址空间,vad是一个树状数据结构,每次分配内存时都会生成一个对于的节点挂入vad树中代表这一块的用户态地址空间已经分配,那么如果没有堆机制的话,每次要分配内存就都要去操作这个vad树了。这样的话就很低效,vad是内核中的结构,被挂入对应进程的EPROCESS中,想进一步了解Windows内核态内存管理的可以看下《windows内核情景分析》上册。此外堆的许多具体实现都是不同的,甚至可以自己去实现自己的堆管理机制函数。

  0x1 找到堆管理函数

  找到堆管理函数,首先要找到使用的libc.so库。libc.so是标准的c函数库,对于windows而言c函数库没什么卵用。但是对于linux系统,c函数库甚至对应于底层调用。

  

从源头看堆溢出——malloc与free

标签:

原文地址:http://www.cnblogs.com/Ox9A82/p/5647945.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!