深入理解计算机系统:内存越界引用和缓冲区溢出

简介: 深入理解计算机系统:内存越界引用和缓冲区溢出

原因


C对数组引用不进行任何边界检查,而且局部变量和状态信息(寄存器值,返回地址)都放在栈里。

当对越界数组元素进行写操作,在进行ret时,容易出现严重错误;


造成后果


缓冲区溢出


栈分配字符数组保存一个字符串,但是其长度超出了为数组分配的空间。


1668326682657.jpg


  • C语言常用的strcpy、sprintf、strcat 等函数都非常容易导致缓冲区溢出问题。


  • 程序运行时,其内存里面一般都包含这些部分:


(1)程序参数和程序环境;


(2)程序堆栈(堆栈则比较特殊,主要是在调用函数时来保存现场,以便函数返回之后能继续运行),它通常在程序执行时增长,一般情况下,它向下朝堆增长。


(3)堆,它也在程序执行时增长,相反,它向上朝堆栈增长;


(4)BSS 段,它包含未初始化的全局可用的数据(例如,全局变量);


(5)数据段,它包含初始化的全局可用的数据(通常是全局变量);


(6)文本段,它包含只读程序代码。


BSS、数据和文本段组成静态内存:在程序运行之前这些段的大小已经固定。程序运行时虽然可以更改个别变量,但不能将数据分配到这些段中。


在栈中分配某个字节数组来保存一个字符串,但是字符串的长度超出了为数组分配的空间。C对于数组引用不进行任何边界检查,而且局部变量和状态信息,都存在栈中。这样,对越界的数组元素的写操作会破坏存储在栈中的状态信息。当程序使用这个被破坏的状态,试图重新加载寄存器或执行ret指令时,就会出现很严重的错误。

void echo()
{
   char buf[8] ;
   gets(buf) ;
   puts(buf) ;
}


输入的字符数量   被破坏的状态


0—7        无


8—11       保存的%ebx的值


12—15      保存的%ebp的值


16—19      返回地址


20+         caller中保存的状态


执行攻击代码exploit code


用一个指向攻击代码的指针覆盖返回地址达到跳转到攻击代码的效果

方式一:攻击代码会使用系统调用启动一个shell程序,给供给者提供一组操作系统函数;

方式二:执行一些未授权的任务,修复对栈的破坏,然后第二次执行ret指令,表面上正常返回到调用者;


蠕虫和病毒的区别


蠕虫:自我复制,可以自己运行,能将自己传播到其他机器

病毒:不能独立运行,把自己添加到包括OS在内的其他程序中。


相关文章
|
3月前
|
存储 缓存 监控
|
3月前
麒麟系统mate-indicators进程占用内存过高问题解决
【10月更文挑战第7天】麒麟系统mate-indicators进程占用内存过高问题解决
336 2
|
2月前
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
151 48
|
26天前
|
机器学习/深度学习 人工智能 缓存
【AI系统】推理内存布局
本文介绍了CPU和GPU的基础内存知识,NCHWX内存排布格式,以及MNN推理引擎如何通过数据内存重新排布进行内核优化,特别是针对WinoGrad卷积计算的优化方法,通过NC4HW4数据格式重排,有效利用了SIMD指令集特性,减少了cache miss,提高了计算效率。
45 3
|
29天前
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
30天前
|
机器学习/深度学习 人工智能 算法
【AI系统】内存分配算法
本文探讨了AI编译器前端优化中的内存分配问题,涵盖模型与硬件内存的发展、内存划分及其优化算法。文章首先分析了神经网络模型对NPU内存需求的增长趋势,随后详细介绍了静态与动态内存的概念及其实现方式,最后重点讨论了几种节省内存的算法,如空间换内存、计算换内存、模型压缩和内存复用等,旨在提高内存使用效率,减少碎片化,提升模型训练和推理的性能。
52 1
|
2月前
|
监控 Java Android开发
深入探讨Android系统的内存管理机制
本文将深入分析Android系统的内存管理机制,包括其内存分配、回收策略以及常见的内存泄漏问题。通过对这些方面的详细讨论,读者可以更好地理解Android系统如何高效地管理内存资源,从而提高应用程序的性能和稳定性。
82 16
|
2月前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
2月前
|
存储 监控 Java
深入理解计算机内存管理:优化策略与实践
深入理解计算机内存管理:优化策略与实践
|
3月前
|
存储 安全 程序员
内存越界写入
【10月更文挑战第13天】
55 4

热门文章

最新文章