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

news2024/12/20 20:17:52

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

文章目录

  • 原因
  • 造成后果
    • 缓冲区溢出
    • 执行攻击代码exploit code
    • 蠕虫和病毒的区别

原因

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) ;
}

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

0—7        无

8—11       保存的%ebx的值

12—15      保存的%ebp的值

16—19      返回地址

20+         caller中保存的状态

执行攻击代码exploit code

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

蠕虫和病毒的区别

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

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1589.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.1 Python 解释器

1. 什么是 Python 解释器 Python 解释器是解释 Python 脚本执行的程序. 开发者在编写 Python 代码保存后, 就会得到一个以.py为扩展名的文本文件, 若要运行此文件, 就需要Python解释器去执行.2. Python 解释器的种类 Python 有好几种版本的解释器:CPython: 官方版本的解释器,…

猿创征文|技术成长之各进制之间的转换

目录 一.非十进制转十进制 方法: 示例 解释 二进制转十进制 八进制转十进制 十六进制转十进制 二.十进制转非十进制 整数部分 方法 示例 十进制整数转二进制 十进制整数转八进制 十进制整数转十六进制 小数部分 方法 十进制小数转二进制 十进制小数转…

反应性叠氮化物N3-PEG-NH2,Azide-PEG-Amine,叠氮-聚二乙醇-胺

一:产品描述 1、名称 英文:N3-PEG-NH2,Azide-PEG-Amine 中文:叠氮-聚二乙醇-胺 2、CAS编号:N/A 3、所属分类:Amine PEG Azide PEG 4、分子量:可定制,叠氮-聚二乙醇-胺10k、叠氮…

Allegro DFM Ravel Rule检查工具介绍

Allegro DFM Ravel Rule检查工具介绍 Allegro任何一个版本都支持DFM Ravel Rule检查,即便是166的版本 打开后的界面如下所示 可以检查项目 测试点,阻焊,走线,丝印,过孔,milling,装配,outline相关的DFM检查 可以让违反规则的设计处以DRC的形式报出来 避免加工问题 首…

Spring+SpringMVC+Mybatis SSM框架详解

一、JDBC编程 1、JDBC 简介 JDBC其实就是 Java 官方提供的一套规范(接口),用于帮助开发人员快速实现不同关系型数据库的连接。 程序运行的时候,数据都是在内存中的。当程序终止的时候,通常都需要将数据保存到磁盘上…

VScode 官网下载太慢解决方法

用惯了HBuilder 和 WebStorm,发现身边很多人也在用 VSCode,就像尝试下。 但是,官网下载太慢了。https://code.visualstudio.com/ 我可是 500M 的宽带啊~!!! 有小道消息说,VSCode 对中国大陆用…

【Linux】软件包管理器 --- yum

目录🌈前言Linux 软件包管理器 yum🚁1、什么是软件包🚂2、yum指令🚃3、关于 rzsz🌈前言 本篇文章进行开发工具的学习!!! Linux 软件包管理器 yum 🚁1、什么是软件包 源…

heapdump 攻击面利用

点击上方蓝字关注我们 一、heapdump案例 1.1 项目中的分析 这个是项目中遇到的一个例子,发现了heapdump泄露,但没有找到可用session,当时就想着内存中应该是有账号密码的,于是就开始找了起来。 用OQL进行搜索,先找…

异地远程群晖NAS教程【cpolar内网穿透】

公网/外网访问群晖NAS,虽然品牌NAS都会有自带DDNS服务,但是公网IPV4很难申请,所以很多用户都会转战内网穿透。网上也有很多教程,比如frp…,但是需要有公网服务器支持来进行搭建,有一定的要求。 cpolar内网穿…

Graphviz安装教程

Graphviz安装教程 官网下载graphviz的安装包 ,网址: https://graphviz.org/download/ 进入下面页面。此处我选择这个版本进行下载, 后面就是安装和配置环境变量问题 安装的时候记住安装路径(最好放到anaconda文件夹下,即**\An…

通讯录的实现(静态版本和动态版本和文件版本)

为什们要实现通讯录? 主要是为了让我们将结构体的知识,了解的更加深刻,将结构体应用一下,我们先将静态的通讯录实现,在进行改良,用动态内存的知识再将通讯录改造一边,将动态内容的知识也运用一…

C++ Reference: Standard C++ Library reference: C Library: cstring: strncat

C官网参考链接&#xff1a;https://cplusplus.com/reference/cstring/strncat/ 函数 <cstring> strncat char * strncat ( char * destination, const char * source, size_t num ); 从字符串中追加字符 将source的第一个num个字符追加到destination&#xff0c;并追加…

重型机床热误差补偿温度敏感测点的识别与优化选择

重型机床热误差补偿温度敏感测点的识别与优化选择 动机与主要贡献 ● 热误差预测的性能主要取决于预测模型的准确性和鲁棒性以及输入的温度变量 ● 在大型数控机床热误差补偿方案中&#xff0c;由于温度敏感点的结构和发热机理复杂&#xff0c;目前仍缺乏有效的温度敏感点识别…

java---贪心---区间分组(每日一道算法2022.10.28)

题目&#xff1a; 给定 N 个闭区间 [ai,bi]&#xff0c;请你将这些区间分成若干组&#xff0c;使得每组内部的区间两两之间&#xff08;包括端点&#xff09;没有交集&#xff0c;并使得组数尽可能小 输出最小组数 第一行包含整数 N&#xff0c;表示区间数 接下来 N 行&#x…

Redis篇(2)——main函数

众所周知&#xff0c;redis是C语言写的。那么main函数来一波 int main(int argc, char **argv) {struct timeval tv;int j;//运行测试方法 #ifdef REDIS_TESTif (argc 3 && !strcasecmp(argv[1], "test")) {if (!strcasecmp(argv[2], "ziplist")…

SpringBoot

SpringBoot项目搭建方式1项目搭建方式2SpringBoot文件配置application.propertiesapplication.ymlSpringBoot整合MybatisSpringBoot整合logbackSpringBoot整合pageHelperSpringBoot整合DruidSpringBoot整合FreeMarkerFreeMarker常用指令(遍历List集合)FreeMarker遍历Map集合Spr…

【树莓派不吃灰】Linux系统下必知必会的一些命令

目录1. 前言2. 必知必会命令2.1 ls -al 列出当前目录下的文件2.2 cd 改变目录2.3 pwd 输出当前目录2.4 clear 清屏命令2.5 mkdir 新建目录2.6 rmdir 删除目录2.7 cat 显示或连接文件内容2.8 touch 创建文件 & cat > 创建文件2.9 rm 删除文件2.10 mv 移动/重命名文件/目录…

【小程序开发】事件监听 | 类型划分 | 属性分析

&#x1f373;作者&#xff1a;贤蛋大眼萌&#xff0c;一名很普通但不想普通的程序媛\color{#FF0000}{贤蛋 大眼萌 &#xff0c;一名很普通但不想普通的程序媛}贤蛋大眼萌&#xff0c;一名很普通但不想普通的程序媛&#x1f933; &#x1f64a;语录&#xff1a;多一些不为什么的…

基于SSM实现前后端分离在线考试管理系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 文末获取源码 项目编号&#xff1a;BS-XX-…

[kafka]二.优化(如何保证不丢数据,且不重复[一次且仅一次])

二.优化 1.不丢失数据ack-1 当Producer向Leader发送消息时&#xff0c;可以通过ack的值来设置可靠性级别。 1&#xff09;1&#xff08;默认&#xff09; 意味着ISR中的Leader已成功收到消息并且Producer得到Leader收到消息的确认。如果ISR中的副本数还没有来得及拉取数据就…