有关于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函数库甚至对应于底层调用。
时间: 2024-10-11 12:52:17