内存对齐和缓冲区溢出攻击

news/2024/9/19 15:33:17/文章来源:https://www.cnblogs.com/Qing1024/p/18416319

一、问候语

客!

二、什么是内存对齐

  计算机中内存空间都是按照字节(byte)进行划分的,所以从理论上讲对于任何类型的变量访问都可以从任意地址开始,但是在实际情况中,在访问特定类型变量的时候经常在特定的内存地址访问,所以这就需要把各种类型数据按照一定的规则在空间上排列,而不是按照顺序一个接一个的排放,这种就称为内存对齐,内存对齐是指首地址对齐,而不是说每个变量大小对齐。通俗一点讲话内存对齐的目的是为了提高CPU读写内存里数据的速度。现代的CPU读取内存并不是一个一个字节挨着读取,这样做的效率非常低。现代的CPU一般以4个字节(32bit数据总线)或者8个字节(64bit数据总线)为一组,一组一组地读写内存里的数据。

  在该图示意的例子中,一个栈空间4个字节,一个char字符占1个字节,每4个字符占一个栈空间,由于内存对齐的原因,不满4个字符也占用1个栈空间,即4个字节。故当字符数组大小为1或者为4时候,都占用1个栈空间,即4个字节。当字符数组大小为5或者为8时候,都占用2个栈空间,即8个字节.在结构体中a变量和c变量均为int型,b变量为char型,int型为4字节,char型为1字节,在不了解内存对齐的原理前,我们计算它们所占字节一般会直接将它们的字节大小加起来,即4+1+4=9字节,但这样的计算是错误的。考虑到内存对齐,实际占用字节应为4+4+4=12个字节。

三、缓冲区溢出攻击原理

  缓冲区溢出攻击是一种常见的安全漏洞,也被称为缓冲区溢出。它发生在程序尝试向缓冲区写入数据时,超过了缓冲区的容量,导致数据溢出到相邻的内存区域。这种溢出可能破坏程序的堆栈,使程序转而执行其它指令,从而达到攻击的目的。缓冲区溢出攻击的原理主要是利用程序中存在的缓冲区溢出漏洞。当程序没有仔细检查用户输入的参数时,攻击者可以通过输入超出缓冲区边界的恶意数据来破坏程序的正常执行流程。这些数据可以覆盖程序中的其他数据或函数返回地址,导致程序执行攻击者指定的恶意代码。例如,在一个简单的C语言程序中,如果程序使用固定大小的缓冲区来接收用户输入,而攻击者输入的数据超过该缓冲区的容量,就会发生缓冲区溢出。攻击者可以构造恶意输入,覆盖函数返回地址,使程序在执行完毕后跳转到攻击者指定的恶意代码处执行。

  在该图示意的c语言代码例子中,字符数组buf的大小为4,调用strcpy函数将src的值传递给buf,此时存在缓冲区溢出漏洞,如果src的大小超过了buf已规定的大小,将会发生缓冲区溢出。

1、当字符数组buf空间大小为2时


  当buf的空间大小为2时候,由于内存对齐,此时在栈中占用4个字节,即要想实现缓冲区溢出攻击,需要4+4+4+1=13个内存空间大小的gbuf

2、当字符数组buf空间大小为4时


  当buf的空间大小为4时候,由于内存对齐,此时在栈中占用4个字节,即要想实现缓冲区溢出攻击,需要4+4+4+1=13个内存空间大小的gbuf

3、当字符数组buf空间大小为5时


  当buf的空间大小为5时候,由于内存对齐,此时在栈中占用8个字节,即要想实现缓冲区溢出攻击,需要8+4+4+1=17个内存空间大小的gbuf,1的数量也应从8个改为12个。故原先13个内存空间大小的gubf无法实现缓冲区溢出攻击

4、当字符数组buf空间大小为22时


  当buf的空间大小为22时候,由于内存对齐,此时在栈中占用24个字节,即要想实现缓冲区溢出攻击,需要24+4+4+1=33个内存空间大小的gbuf,1的数量也应为28个

5、缓冲区溢出攻击相关计算


  以当字符数组buf空间大小为2时的情况为例子。gbuf的大小应为4+4+4+1=13即可实现缓冲区溢出攻击。1的数量为8。1的数量大小4+4=8主要是为了覆盖局部数组buf和栈基址指针ebp。即((void**)(gbuf + 8)) = exploit;中的+8。后面的+4是为了覆盖原先返回地址,将我们要跳转的目的地址替换掉原先的地址。最后的+1是空字符\0。((void**)(gbuf + 8)) = exploit;其中exploit为我们要跳转的目的地址

四、预防缓冲区溢出攻击

1、输入验证和长度检查

  最基本的防护方法是进行输入验证和长度检查。程序员应该在编写代码时,对所有的输入数据进行严格的验证和长度检查,确保输入数据不会超过缓冲区的容量。这可以通过使用安全的库函数或者自定义的函数来实现。例如,使用strncpy函数代替strcpy函数可以避免缓冲区溢出的问题,因为strncpy函数允许指定目标缓冲区的大小。

2、使用安全的库函数

  使用安全的库函数也是防止缓冲区溢出攻击的防护方法之一。程序员应该尽可能使用安全的库函数,例如strncpy、snprintf等,这些函数在处理输入数据时会自动进行长度检查,避免了缓冲区溢出的问题。此外,程序员还应该了解并避免使用不安全的库函数,例如strcpy、sprintf等。

3、栈保护

  栈保护是一种有效的缓冲区溢出攻击防护方法。它通过在栈上添加保护机制,防止攻击者利用缓冲区溢出漏洞覆盖栈上的返回地址或者其他重要数据。常见的栈保护技术包括:1.栈随机化:通过随机化栈的基地址,使得攻击者无法准确地预测栈的布局,从而增加了攻击的难度。2.栈保护:通过在栈上添加保护机制,例如Canary值或者GS标志位,检测栈是否被篡改,从而防止攻击者利用缓冲区溢出漏洞进行攻击。

4、地址空间布局随机化(ASLR)

  地址空间布局随机化(ASLR)是一种有效的缓冲区溢出攻击防护方法。它通过随机化程序的内存布局,使得攻击者无法准确地预测内存地址,从而增加了攻击的难度。ASLR可以通过操作系统或者编译器来实现,程序员只需要在编写代码时开启相应的选项即可。

5、数据执行保护(DEP)

  数据执行保护(DEP)也是一种有效的缓冲区溢出攻击防护方法。它防止程序在内存中执行恶意代码,从而防止了缓冲区溢出攻击。DEP可以通过操作系统或者编译器来实现,程序员只需要在编写代码时开启相应的选项即可。

五、结束语

此随笔内容仅为学习缓冲区溢出攻击的一些感悟、想法与总结,由于本人能力有限,如随笔内容有错误希望能见谅并加指出。--------------------------------------------------------------------------------------------------------如果感兴趣的话可以点击页面下方的关注感谢你的支持!

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

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

相关文章

ARM SMMU原理与IOMMU技术(“VT-d” DMA、I/O虚拟化、内存虚拟化)

名词缩写ASID:Address Space ID 地址空间标识符 CD:Context Descriptor; 上下文描述符; CTP:Context-table pointer 上下文表指针 EPT:Extended Page Table 扩展页表 GPA:Guest Phyical Address 客人的实际地址 GVA:Guest Virtual Address 访客虚拟地址 HPA:Host…

博客园评论区头像换页更新解决方案

使用 MutationObserver 解决了评论区头像换页无法更新的问题。前言 博客园博客正文的评论区的每一条评论其实都是带用户头像链接的,因此有些博客主题利用这个链接,对评论新增了头像显示功能。 但是这部分功能只能在第一次加载页面时有效,一旦出现评论翻页、排序等操作,头像…

数学知识(初赛)

求最大公约数的技巧 利用辗转相除法,gcd(A,B)=gcd(B,A%B),就可以很快速求解。 应用:化简分数,数学题等等。原理:理解为一个长方形,然后要尽量去铺最大正方形,以满足铺满长方形。最后一个铺满长方形的那个正方形肯定是最大公约数。 如下图,这个长方形先铺一个绿色…

高等数学 2.4 隐函数及由参数方程确定的函数的导数

目录一、隐函数求导二、由参数方程所确定的函数的导数三、相关变化率 一、隐函数求导 函数 \(y = f(x)\) 表示两个变量 \(y\) 与 \(x\) 之间的对应关系,这种对应关系可以用各种不同方式表达,例如 \(y = \sin x\) ,\(y = \ln x + \sqrt{1 - x^2}\) 等。这种函数表达方式的特点…

小林coding学习笔记(内存页面置换算法)

缺页中断示意图1 在CPU里执行一条查找某个页面A的指令,首先是虚拟内存,会到虚拟内存和物理内存的映射关系的页表中查询。 2 页表中不存在需要查找的页面A的有效信息。 3 则触发缺页中断信号给操作系统,操作系统收到缺页中断信号后,就会去磁盘里面查找该页面。 4 操作系统在…

Unity中的三种渲染路径

Unity中的渲染路径 Unity的渲染路径 在Unity里,渲染路径(Rendering Path)决定了光照是如何应用到Unity Shader中的。因此,我们只有为Shader正确地选择和设置了需要的渲染路径,该shader的光照计算才可以被正确执行。 unity中的渲染路径:Forward Rendering Path (向前渲染…

白云龙期货投资-第一讲

# 期货散户投资者常见错误 抄底摸顶,进场无依据,无参照物 小赢大亏(小鸟吃食 大象拉屎资金曲线) 用错误的方法分析行情(金死叉) 过分依赖各种交易软件,公式 持亏损的单子隔夜 死扛(进场条件)期货散户投资者常见错误 抄底摸顶,进场无依据,无参照物 小赢大亏(小鸟吃食 大…

408五级流水线强化课笔记

408强化课录播五级流水线相关内容笔记指令流水线基本概念:简单的概念题 指令流水线基本实现:指令按序发射,按序完成 各种冒险:结合MIPS指令序列分析并处理冒险 超标量和动态流水线:简单的概念题五级流水线 五级流水线的设计是为了通过并行提高处理器的吞吐量。图片来自CSA…

关键字检索分析-案例2:开源代码分析

第一次拿来分析一下开源代码,上效果图代码和文件地址 具体内容参考我前面一篇博客 spring-frameworkredis, redis单个文件非常大mybatis我实话我没有看过这些源码。 之前的博客里的脚本,bug挺多的。可以以gitee这里为主(链接在最上面)。

小林coding学习笔记(进程调度算法)

//进程调度算法 进程调度算法是CPU通过进程调度算法决定某个时刻去调用哪个进程到CPU上运行的算法 1、先来先服务调度算法 每次从就绪队列的队头调度到CPU上运行,直到进程退出或被阻塞,才会继续从队列中调度进程运行。 特点:对短作业不利,对长作业有利,无法平衡短作业与长…

spring mvc详细讲解(前后端分离模式)

在前后端分离模式下,Spring MVC 的作用主要集中在处理后端的业务逻辑和 API 接口,而不再直接管理视图部分。也就是说,Spring MVC 的重点是如何处理客户端的请求并返回数据(通常以 JSON 或 XML 格式),而视图渲染交给前端框架(如 Vue.js、React 等)来完成。 下面是针对前…

关于API淘宝数据接口

在当今数字化商业时代,淘宝作为全球领先的电商平台,提供了丰富的API接口,使开发者能够高效地获取和管理电商数据。淘宝API接口不仅简化了与淘宝平台的交互,还为商家提供了强大的数据支持,帮助他们更好地分析市场趋势、优化店铺运营、提升用户体验。 淘宝API接口概述 淘宝A…