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

  有关于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

从源头看堆溢出——malloc与free的相关文章

【转载】利用一个堆溢出漏洞实现 VMware 虚拟机逃逸

1. 介绍 2017年3月,长亭安全研究实验室(Chaitin Security Research Lab)参加了 Pwn2Own 黑客大赛,我作为团队的一员,一直专注于 VMware Workstation Pro 的破解,并成功在赛前完成了一个虚拟机逃逸的漏洞利用.(很不)幸运的是,就在 Pwn2Own 比赛的前一天(3月14日),VMware 发布了一个新的版本,其中修复了我们所利用的漏洞.在本文中,我会介绍我们从发现漏洞到完成利用的整个过程.感谢@kelwin 在实现漏洞利用过程中给予的

Linux 堆溢出原理分析

堆溢出与堆的内存布局有关,要搞明白堆溢出,首先要清楚的是malloc()分配的堆内存布局是什么样子,free()操作后又变成什么样子. 解决第一个问题:通过malloc()分配的堆内存,如何布局? 上图就是malloc()分配两块内存的情形. 其中mem指针指向的是malloc()返回的地址,pre_size与size都是4字节数据,size存放当前chunk(内存块,本文均不翻译)大小,pre_size存放上一个chunk大小. 因为malloc实现分配的内存空间是8字节对齐的,所以size的

转:利用一个堆溢出漏洞实现VMware虚拟机逃逸

转:https://zhuanlan.zhihu.com/p/27733895?utm_source=tuicool&utm_medium=referral 利用一个堆溢出漏洞实现VMware虚拟机逃逸 [作者:李小龙(acez),中文翻译:kelwin] 1. 介绍 2017年3月,长亭安全研究实验室(Chaitin Security Research Lab)参加了Pwn2Own黑客大赛,我作为团队的一员,一直专注于VMware Workstation Pro的破解,并成功在赛前完成了一个虚

Linux堆溢出漏洞利用之unlink

Linux堆溢出漏洞利用之unlink 作者:走位@阿里聚安全 0 前言 之前我们深入了解了glibc malloc的运行机制(文章链接请看文末▼),下面就让我们开始真正的堆溢出漏洞利用学习吧.说实话,写这类文章,我是比较怂的,因为我当前从事的工作跟漏洞挖掘完全无关,学习这部分知识也纯粹是个人爱好,于周末无聊时打发下时间,甚至我最初的目标也仅仅是能快速看懂.复现各种漏洞利用POC而已-鉴于此,后续的文章大致会由两种内容构成:1)各种相关文章的总结,再提炼:2)某些好文章的翻译及拓展.本文两者皆有

《黑客攻防-系统实战》--堆溢出

参考文献 <系统攻防技术-系统实战> https://bbs.pediy.com/thread-217613.htm https://www.cnblogs.com/gm-201705/p/9901548.html 一.  堆是什么? 程序运行过程中,需要更多的内存时,如果使用brk() 和 mmap() 进行处理,效率不高而且比较复杂,因此当程序需要分配或释放内存的时候,libc 为程序员提供malloc(), remalloc() 和 free(). 在接到请求时(例如用户请求1024个字

Java JVM:内存溢出(栈溢出,堆溢出,持久代溢出以及 nable to create native thread)

转载自https://github.com/pzxwhc/MineKnowContainer/issues/25 包括:1. 栈溢出(StackOverflowError)2. 堆溢出(OutOfMemoryError:java heap space)3. 永久代溢出(OutOfMemoryError: PermGen space)4. OutOfMemoryError:unable to create native thread Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序

stm32 堆溢出

STM32 堆溢出 遇到的问题 最近在给旧项目添加了段代码,程序经常到某个状态就突然崩溃了,也不一定是在运行新代码的时候崩溃.检查了几遍代码,数组越界访问,除数为0,内存泄露等常见的问题都不存在. 原因 最后发现,问题出在程序中用mallc动态分配内存,却没对是否成功分配做检查.程序中,因为堆空间不足,分配内存不成功,malloc返回NULL.后面的代码对NULL地址进行写操作,引起了程序崩溃. 后续的一些概念整理 STM32系列单片机在startup_stm32fxx.s文件中,定义了Heap

Windows堆溢出漏洞简单总结

堆溢出漏洞的利用难度比栈溢出利用要大的多,每个不同的漏洞可能综合利用不同的技术.堆溢出漏洞的根源也是没有正确的使用非安全函数(这里是微软禁用的非安全函数),导致用户输入的数据覆盖掉其它内存地址.而我们的利用步骤也是通过覆盖可用内存数据,从而控制EIP.在这篇文章里

实战Java虚拟机之中的一个“堆溢出处理”

从今天開始.我会发5个关于java虚拟机的小系列: 实战Java虚拟机之中的一个"堆溢出处理" 实战Java虚拟机之二"虚拟机的工作模式" 实战Java虚拟机之三"G1的新生代GC" 实战Java虚拟机之四"禁用System.gc()" 实战Java虚拟机之五"开启JIT编译" 以下说说[实战Java虚拟机之中的一个"堆溢出处理"] 在Java程序的执行过程中,假设堆空间不足.则有可能抛