深入理解计算机系统 3.7 缓冲区溢出

3.7.1 数据对齐

许多计算机系统对基本数据类型的合法地址做出了一些限制,要求某种类型对象的地址必须是某个值K(通常是2、4或8)的倍数。这种对齐限制简化了形成处理器和内存系统之间接口的硬件设计。例如,假设一个处理器总是从内存中取8个字节,则地址必须为8的倍数。如果我们能保证将所有的double类型数据的地址对齐成8的倍数,那么就可以用一个内存操作来读或者写值了。否则,我们可能需要执行两次内存访问,因为对象可能被分放在两个8字节内存块中。无论数据是否对齐,x86-64硬件都能正确工作。不过,Intel还是建议要对齐数据以提高内存系统的性能。对齐原则是任何K字节的基本对象的地址必须是K的倍数。可以看到这条原则会得到如下对齐:

确保每种数据类型都是按照指定方式来组织和分配,即每种类型的对象都满足它的对齐限制,就可保证实施对齐。编译器在汇编代码中放人命令,指明全局数据所需的对齐。例如,下面这样的命令: 

.align 8

这就保证了它后面的数据(在此,是跳转表的开始)的起始地址是8的倍数。因为每个表项长8个字节,后面的元素都会遵守8字节对齐的限制。

对于包含结构的代码,编译器可能需要在字段的分配中插入间隙,以保证每个结构元素都满足它的对齐要求。而结构本身对它的起始地址也有一些对齐要求。

比如说,考虑下面的结构声明:
struct S1 {
int i;
char c;                                                                                                                                                int j;
};

假设编译器用最小的9字节分配,画出图来是这样的: 

 它是不可能满足字段i(偏移为0)和j(偏移为5)的4字节对齐要求的。取而代之地,编译器在字段c和主之间插入一个3字节的间隙(在此用蓝色阴影表示):

结果,j的偏移量为8,而整个结构的大小为12字节。此外,编译器必须保证任何struct s1*类型的指针p都满足4字节对齐。用我们前面的符号,设指针p的值为x。那么,x必须是4的倍数。这就保证了 p->i(地址 x)和 p->j(地址x十8)都满足它们的4字节对齐要求。 

另外,编译器结构的末尾可能需要一些填充,这样结构数组中的每个元素都会满足它的对齐要求。

3.7.2 内存越界引用

内存越界引用‌是指程序在访问数组时,超出了数组的实际边界。在C语言中,数组的引用通常不进行边界检查,这意味着程序员需要自己确保不会访问超出数组分配的内存范围。如果访问了超出数组边界的内存,可能会导致程序崩溃、数据损坏或其他不可预测的行为。

内存越界引用的原因和影响

原因‌:

(1)‌局部数据存储‌:在C语言中,局部数据(如数组、结构体)通常存储在栈上。如果访问了栈上的数组元素超出了其分配的内存范围,就会发生内存越界引用‌。

(2)‌指针操作不当‌:使用指针进行数组访问时,如果没有正确计算索引,很容易导致越界‌。

影响:

‌(1)数据损坏‌:越界访问可能会修改其他变量的值,导致程序行为异常。

(2)‌程序崩溃‌:访问未分配的内存可能导致程序崩溃或产生不可预测的行为‌。‌

(3)安全风险‌:在安全敏感的应用中,内存越界可能导致缓冲区溢出攻击,从而执行恶意代码‌。

调试和预防内存越界引用的方法

‌调试方法‌:

(1)断点调试‌:在可能发生越界的代码处设置断点,逐步执行并观察变量的变化‌。‌

(2)内存检查工具‌:使用工具如Valgrind等来检测内存越界和泄漏问题‌。

预防措施‌:

(1)边界检查‌:在访问数组前,检查索引是否在合法范围内。‌

(2)使用安全的函数‌:避免使用可能导致缓冲区溢出的函数,如strcpysprintf等,改用安全的替代函数如strncpysnprintf等‌。

(3)‌代码审查‌:定期审查代码,确保没有潜在的内存越界问题‌。

3.7.3 缓冲区溢出和缓冲区溢出攻击

1.原理

缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。理想的情况是,程序会检查数据长度,并且不允许输入超过缓冲区长度的字符。但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区,又被称为“堆栈”,在各个操作进程之间,指令会被临时储存在“堆栈”当中,“堆栈”也会出现缓冲区溢出。

2.攻击方式

缓冲区溢出攻击是利用缓冲区溢出漏洞所进行的攻击行动。攻击者可以通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序有root权限,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作。缓冲区溢出攻击可以导致程序运行失败、系统关机、重新启动等后果,甚至可以利用它执行非授权指令,取得系统特权,进而进行各种非法操作。

3.检测和预防

检测和预防缓冲区溢出是一个重要的安全问题。由于缓冲区溢出漏洞在C、C++等不提供内存越界检测功能的语言中编写的程序中广泛存在,因此,对于这类程序,需要特别注意检测和预防缓冲区溢出。具体的检测和预防方法可能包括:

  • 代码审查‌:对程序代码进行严格的审查,确保数据长度的检查和执行权限的控制。
  • 使用安全函数‌:在编程时使用提供边界检查的安全函数,避免使用不安全的函数。
  • 工具检测‌:使用专门的工具对程序进行检测,发现潜在的缓冲区溢出漏洞。
  • 权限控制‌:限制程序的执行权限,防止攻击者利用缓冲区溢出获得更高的权限。

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

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

相关文章

代码随想录刷题记录(二十七)——55. 右旋字符串

(一)问题描述 55. 右旋字符串(第八期模拟笔试)https://kamacoder.com/problempage.php?pid1065字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数&…

QT打包应用程序文件步骤

QT应用程序(.exe)打包复制到其他电脑 在QT程序在自己电脑编译好了后,需要打包给其他人。这里介绍一下详细步骤: 确定编译器 搜了很多相关的打包教程,但是还是会出现“应用程序无法正常启动(0xc000007b)”这类错误。经过…

我谈维纳(Wiener)复原滤波器

Rafael Gonzalez的《数字图像处理》中,图像复原这章内容几乎全错。上篇谈了图像去噪,这篇谈图像复原。 图像复原也称为盲解卷积,不处理点扩散函数(光学传递函数)的都不是图像复原。几何校正不属于图像复原&#xff0c…

10款音频剪辑推荐!!你的剪辑好帮手!!

在如今的数据化浪潮中,工作已经采用了线上线下相结合。我的工作就需要借助一些剪辑工具,来实现我对音频工具的剪辑。我初次接触到音频剪辑也是因为工作需求,从起初我只是一个音频剪辑的小白,这些工具的协助。吸引着我。对于这些工…

Rocky、Almalinux、CentOS、Ubuntu和Debian系统初始化脚本v9版

Rocky、Almalinux、CentOS、Ubuntu和Debian系统初始化脚本 Shell脚本源码地址: Gitee:https://gitee.com/raymond9/shell Github:https://github.com/raymond999999/shell脚本可以去上面的Gitee或Github代码仓库拉取。 支持的功能和系统&am…

Scrapy搭配Selenium爬取豆瓣电影250排行榜动态网页数据

参考CSDN博客:https://blog.csdn.net/qq_43213783/article/details/113063557 2024年11月11日实现。 创建movie_douban爬虫项目: scrapy startproject movie_douban 进入spiders: cd movie_douban/movie_douban/spiders 创建doubanMovieSpi…

想定制RK3566/3568安卓11开机logo吗?触觉智能Purple Pi OH来教你

本文介绍瑞芯微RK3566/RK3568主板/开发板安卓Android11系统替换开机Logo的方法,使用触觉智能Purple Pi OH鸿蒙开发板演示,搭载了瑞芯微RK3566芯片,4核1.8Ghz1T算力NPU;类树莓派设计,Laval社区主荐,已适配全…

【AliCloud】ack + ack-secret-manager + kms 敏感数据安全存储

介绍 ack-secret-manager支持以Kubernetes Secret实例的形式向集群导入或同步KMS凭据信息,确保您集群内的应用能够安全地访问敏感信息。通过该组件,您可以实现密钥数据的自动更新,使应用负载通过文件系统挂载指定Secret实例来使用凭据信息&a…

网页设计平台:6个技术亮点

想要创建个人或商业网站来分享知识或推广商品吗?这篇文章将为你介绍6个免费的网页制作平台,帮助你即使没有编程基础也能快速、轻松地搭建出专业且引人注目的网站。让我们一起探索这些平台,发现它们的特色和优势。 即时设计 即时设计是一个云…

构造,CF 2029D - Cool Graph

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 D - Cool Graph 二、解题报告 1、思路分析 我们对每条 <u, v>&…

uniapp—android原生插件开发(1环境准备)

本篇文章从实战角度出发&#xff0c;将UniApp集成新大陆PDA设备RFID的全过程分为四部曲&#xff0c;涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程&#xff0c;轻松应对安卓原生插件开发与打包需求&#xff01; 项目背景&#xff1a; UniApp集成新大陆P…

第2章2.3立项【硬件产品立项的核心内容】

硬件产品立项的核心内容 2.3 硬件产品立项的核心内容2.3.1 第一步&#xff1a;市场趋势判断2.3.2 第二步&#xff1a;竞争对手分析1.竞争对手识别2.根据竞争对手分析制定策略 2.3.3 第三步&#xff1a;客户分析2.3.4 第四步&#xff1a;产品定义2.3.5 第五步&#xff1a;开发执…

常见计算机网络知识整理(未完,整理中。。。)

TCP和UDP区别 TCP是面向连接的协议&#xff0c;发送数据前要先建立连接&#xff1b;UDP是无连接的协议&#xff0c;发送数据前不需要建立连接&#xff0c;是没有可靠性&#xff1b; TCP只支持点对点通信&#xff0c;UDP支持一对一、一对多、多对一、多对多&#xff1b; TCP是…

突破性能瓶颈,几个高性能Python网络框架,高效实现网络应用

引言 随着互联网和大数据时代的到来&#xff0c;高性能网络应用的需求日益增加。Python作为一种流行的编程语言&#xff0c;在高性能网络编程领域也具有广泛的应用。本文将深入探讨基于Python的几种高性能网络框架&#xff0c;分析它们各自的优势和适用场景&#xff0c;帮助开发…

中国智能网联汽车技术规程(C-ICAP-2024版)之基础行车辅助测试介绍及文档分享24年7月1号实施

C-ICAP(2024 版)对辅助驾驶测评单元(行车辅助项目、泊车辅助项目)、智慧座舱测评单元、隐私保护测评单元开展测试评价。 1 行车辅助评价项目 行车辅助项目包括基础行车辅助和领航行车辅助。其中,基础行车辅助部分为必测项,包括跟车能力、组合控制能力、紧急避险能力和驾…

一文详解MacOS使用VSCode搭建SpringBoot+Gradle开发环境

开发后端Java应用时&#xff0c;大多数开发者使用的是IntelliJ IDEA&#xff0c;但该软件是一个付费软件&#xff0c;所以希望可以使用开源且免费的VSCode来创建和开发后端项目。本文为本人在 Mac 上使用 Visual Studio Code&#xff08;简称 VSCode&#xff09;集成开发环境来…

创建者模式之【建造者模式】

建造者模式 概述 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于&#xff1a;某个对象的构建过程复杂的情况。由于实现了构建和…

pyspark入门基础详细讲解

1.前言介绍 学习目标&#xff1a;了解什么是Speak、PySpark&#xff0c;了解为什么学习PySpark&#xff0c;了解课程是如何和大数据开发方向进行衔接 使用pyspark库所写出来的代码&#xff0c;既可以在电脑上简单运行&#xff0c;进行数据分析处理&#xff0c;又可以把代码无缝…

5. 类加载子系统

一、前言 前面我们了解了字节码文件的大致组成部分&#xff0c;那么 JVM 是如何加载 .class字节码文件的&#xff1f;加载到.class字节码文件后又做了哪些事情呢&#xff1f; 二、类加载子系统初步认识 首先类加载子系统作为虚拟机和外界的一个对接口&#xff0c;主要负责以…

AI 写作(六):核心技术与多元应用(6/10)

一、AI 写作的核心技术概述 AI 写作在当今数字化时代正发挥着越来越重要的作用。它不仅极大地提高了写作效率&#xff0c;还为不同领域带来了创新的可能性。 AI 写作的核心技术主要包括基于模板的文本生成和基于深度学习的文本生成。基于模板的文本生成通常依赖预先设定的模板…