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


    注:最后有面试挑战,看看自己掌握了吗

    原因

    C对数组引用不进行任何边界检查,而且局部变量和状态信息(寄存器值,返回地址)都放在栈里。
    当对越界数组元素进行写操作,在进行ret时,容易出现严重错误;

    造成后果

    缓冲区溢出

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

    在这里插入图片描述

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

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

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

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

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

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

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

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

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

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

    void echo()
    {
       char buf[8] ;
       gets(buf) ;
       puts(buf) ;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    0—7        无

    8—11       保存的%ebx的值

    12—15      保存的%ebp的值

    16—19      返回地址

    20+         caller中保存的状态

    执行攻击代码exploit code

    1. 用一个指向攻击代码的指针覆盖返回地址达到跳转到攻击代码的效果
    2. 方式一:攻击代码会使用系统调用启动一个shell程序,给供给者提供一组操作系统函数;
    3. 方式二:执行一些未授权的任务,修复对栈的破坏,然后第二次执行ret指令,表面上正常返回到调用者;

    蠕虫和病毒的区别

    蠕虫:自我复制,可以自己运行,能将自己传播到其他机器
    病毒:不能独立运行,把自己添加到包括OS在内的其他程序中。

    🍃博主昵称:一拳必胜客
    博主主页面链接:博主主页传送门
    🌸博主寄语:欢迎点赞哦-------千古文章一大抄,抄来抄去有提高;
     特别鸣谢:木芯工作室
    特别鸣谢:木芯工作室 、Ivan from Russia


  • 相关阅读:
    dedecms织梦快照被挟持和篡改入侵漏洞修复
    设计模式:状态模式(C++实现)
    Rust 从入门到精通06-语句和表达式
    MySQL 操作语句大全(详细)
    docker bash: vi: command not found 修改文件无法使用 vi yum的方法
    开发前期准备工作
    web前端-javascript-标识符(说明,命名规则、不以数字关键字保留字开头、驼峰命名,补充)
    Deadfellaz Game Jam 启动,丰厚奖励等你来赢取!
    【Linux】编写COM口和USB口的规则文件(.rules)
    and-design-vue 3.2.20官方离线文档(中文)
  • 原文地址:https://blog.csdn.net/weixin_43796670/article/details/127563709