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

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

原因


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在内的其他程序中。


相关文章
|
1月前
|
存储 缓存 监控
|
1月前
麒麟系统mate-indicators进程占用内存过高问题解决
【10月更文挑战第7天】麒麟系统mate-indicators进程占用内存过高问题解决
176 2
|
11天前
|
存储 监控 Java
深入理解计算机内存管理:优化策略与实践
深入理解计算机内存管理:优化策略与实践
|
26天前
|
存储 安全 程序员
内存越界写入
【10月更文挑战第13天】
35 4
|
25天前
|
存储 安全 编译器
内存缓冲区溢出
【10月更文挑战第14天】
37 1
|
25天前
|
Rust 安全 Java
内存数组越界
【10月更文挑战第14天】
22 1
|
26天前
|
Java 编译器 C++
内存越界读取
【10月更文挑战第13天】
33 2
|
27天前
|
存储 容器
内存越界访问(Out-of-Bounds Access)
【10月更文挑战第12天】
133 2
|
1月前
|
运维 JavaScript Linux
容器内的Nodejs应用如何获取宿主机的基础信息-系统、内存、cpu、启动时间,以及一个df -h的坑
本文介绍了如何在Docker容器内的Node.js应用中获取宿主机的基础信息,包括系统信息、内存使用情况、磁盘空间和启动时间等。核心思路是将宿主机的根目录挂载到容器,但需注意权限和安全问题。文章还提到了使用`df -P`替代`df -h`以获得一致性输出,避免解析错误。
|
1月前
麒麟系统mate-indicators进程占用内存过高问题解决
【10月更文挑战第5天】麒麟系统mate-indicators进程占用内存过高问题解决
134 0