Memcpy越界操作导致free崩溃分析
来源:互联网 发布:php会员订单系统源码 编辑:程序博客网 时间:2024/06/05 00:08
问题现象
在使用一个开源播放器的时候,每次在音频即将播放完毕的时候,会崩溃,经过排查分析发现是由于memcpy拷贝越界问题。然后编写示例代码确实会出现类型现象,示例代码如下:
导致崩溃代码
- 首先让我们看上面示例代码找错误的时候,大家在不使用编译器进行调试的时候,我想大家查找的错误点有以下几个地方:
- 第11行src [201] ='a'; 会导致崩溃。
- 第16行memcpy(dst, src, 200); 会导致崩溃。
- 但是真正使用vs2015编译调试发现真正崩溃的地方只有一处,如下:
- 第18行free(dst); //该行会崩溃。
分析崩溃原因
- 首先为什么第11行没有崩溃呢,其实这个跟第16行是一样的,这个我们在操作这块内存的时候,该块内存不是系统暂用的内存区域,它就是一块内存区域,我们可以任意写数据,但是他确实会影响内存中的数据,当该函数退出是否堆栈的时候就会出现如下问题,我想这个问题大家还是经常遇到的:
- 有了上面的依据我们就可以简单知道为什么memcpy越界后会导致free的时候会出现崩溃了,那我们还需要了解memcpy的实现原理,其实memcpy是没有对目的地址进行内存检查的直接,将count大小的数据拷贝到dest中去,所以就存在跟上面数组越界在函数退出的时候会出现崩溃一样,如下:
了解molloc和free能够更好的理解该崩溃原因
- 首先我们想一个问题,我们molloc一块内存,在free的时候只需要传递指针首地址操作系统(或者说C语言)就可以对内存进行释放,那么它是怎么知道应该释放多大的内存呢,查阅资料发现其实C语言是维护了一个数据结构类似如下的结构,这个结构中主要有两个数据:一个是当前内存块的大小,另外一个是指向下一个空闲内存块:
- 如上其实我们在molloc(10)一块内存的时候,真正申请的不止是10个字节大小的内存,而是要加上一个struct Header结构体的大小,molloc返回给我们的内存想当于是p+sizeof(Header)的指针,而在free的时候,则C语言只需要将p-sizeof(Header)就能找到header结构,从而知道内存块大小。
- 我们了解了如上的结构就大概知道为什么会在free的时候出错了,这是因为我们其实在memcpy的时候,已经破坏了相应的内存结构,这个会导致我们free的时候,操作内存的时候出现错误。
总结
该观点也是借助其他高人,自己总结的可能有所不正确,欢迎指正共同研究,参考文章: http://www.cnblogs.com/wuyuegb2312/archive/2013/05/03/3056309.html
1 0
- Memcpy越界操作导致free崩溃分析
- memcpy函数越界分析
- 数组越界导致程序崩溃
- 由memcpy越界引起的崩溃
- alloc/越界存取/free 与 进程崩溃
- 内存写越界导致破环堆结构引起的崩溃问题定位经验[如报错malloc(): memory corruption或free(): invalid next size]
- 内存写越界导致破环堆结构引起的崩溃问题定位经验[如报错malloc(): memory corruption或free(): invalid next size]
- memset内存越界导致函数堆栈崩溃的例子
- 数组-memcpy-越界
- 警惕memcpy()函数越界
- Sybase IQ 15.1操作导致系统崩溃
- 数组越界导致的运行崩溃(枚举作为数组中的常量)
- ios 使用运行时规避数组等越界导致程序崩溃
- IIS+ASP.NET+C++一次访问越界导致的崩溃调试
- ios 11以上系统,tableview上啦刷新,indexPath.row,自动加5,引起数组越界的问题导致崩溃
- 关于9行代码导致系统崩溃的分析整理
- 关于9行代码导致系统崩溃的分析整理
- 内存MCE错误导致系统崩溃的问题分析
- 各类视频教程--米学网
- 过滤器
- 1083. List Grades (25)
- .net实战项目零基础学习视频教程,.net就业课程网络教学
- IOS发送Email的两种方法
- Memcpy越界操作导致free崩溃分析
- 格式化Spring MVC 返回json的Date格式
- Webstorm常用快捷键
- 深入理解C++中public、protected及private用法
- 边界追踪中有关轮廓信息统计的函数
- MySQL concat函数的使用
- 黑马程序员_集合框架Collection
- SQL语句中的limit使用方法
- Javascript事件实例详解