Buffer Overflow缓冲区溢出和保护措施

news2024/11/15 11:40:44

缓冲区溢出是指当数据写入某个缓冲区(buffer)时,超出了为该缓冲区分配的内存空间,从而导致覆盖了相邻内存区域的情况。这种现象可能导致程序崩溃、数据损坏,甚至引发安全漏洞,允许攻击者利用这一漏洞执行恶意代码。

typedef struct {
int a[2];
double d;
} struct_t;
double fun(int i) {
volatile struct_t s;
s.d = 3.14;
s.a[i] = 1073741824; /* Possibly out of bounds */
return s.d;
}

比如这个代码中,在内存中,a中的元素和d其实是挨着的,如果给a赋值了超过了它当前容量的数据,那么就会覆盖d的内容,导致d的值混乱。

栈破坏攻击(Stack Smashing Attacks)

在上篇文章我们知道当函数调用另一个函数时,会为其分配一个栈帧,并且这个栈帧的上面就是返回地址,那么如果我们在被调用的函数中超量使用了给它分配的内存,就会有可能覆盖那个返回地址,从而引发错误。

比如这个例子中,被调用的函数使用gets()方法接受用户输入,然由于这个gets方法的不安全性(它不对用户输入内容的长度做限制),所以只要我们输入一大长串,我们的输入就会从底部一直往上填补,直到我们覆盖了绿色方块部分也就是函数返回地址,我们就把程序搞崩溃了。在栈破坏攻击中,攻击者覆盖的返回地址通常属于上一个函数的栈帧。系统帮我们把函数返回值放在了上一个栈帧的最底部,并且在新的栈帧中留了很大一部分空间,但只要输入够多,总会把上面的内容覆盖。

上面的例子就叫做栈破坏攻击(Stack Smashing Attacks)。大概原理就是攻击者首先需要找到一个目标程序中存在缓冲区溢出漏洞的函数。通常,这些函数会接收外部输入,且未对输入长度进行适当的检查。攻击者构造一段恶意输入数据,使其在被处理时会导致栈上的缓冲区溢出。我们甚至可以直接把函数返回值直接覆盖成别的函数地址,从而改变程序的执行顺序。

代码注入攻击(Code Injection Attacks)

代码注入攻击和上面的攻击很像,就是多加了一步,你不是可以修改函数返回地址吗? 那我们干脆直接跳转到我们写的函数上去!我们把自己写的代码(转换成可执行的字节表示后)放进空闲区,并且知道它的地址,直接把覆盖地址写成这个地址就好了。

这种情况下,自己写的代码叫做exploit code,当函数返回时(因为返回地址B处被修改了),代码就会跳到exploit code那继续执行。

避免buffer overflow的保护措施

1.提高代码的健壮性,使用限制字符串长度的库函数。例如:

  • 使用fgets代替getsfgets允许您指定读取的最大字符数,从而避免缓冲区溢出。
  • 使用strncpy代替strcpystrncpy允许您指定复制的最大字符数,防止目标缓冲区溢出。
  • 避免使用scanf函数的%s格式说明符。因为%s不会限制读取的字符串长度,容易导致缓冲区溢出。可以使用fgets读取字符串,代替使用scanf。或者在scanf中使用%ns格式说明符,其中n是一个合适的整数,用于限制读取的字符数
/* Echo Line */
void echo() {
  char buf[4];
  fgets(buf, 4, stdin); // 使用fgets以限制读取的字符数
  puts(buf);
}

2. 使用系统级别的保护 System-Level Protections

2.1随机化栈偏移(Randomized Stack Offsets)

也称为地址空间布局随机化(ASLR, Address Space Layout Randomization)。在程序启动时,为栈分配随机大小的空间,从而改变整个程序的栈地址。这使得攻击者难以预测插入代码的起始地址。随着程序的多次执行,栈的位置会不断改变,就算把代码注入进去了,也不知道它的地址是在哪里。提高了攻击难度。

2.2 不可执行内存(Non-Executable Memory)

对于较旧的x86 CPU,它们会从任何可读地址执行机器代码。x86-64 架构引入了一种标记内存区域为不可执行的方法。如果程序尝试跳转到这些区域执行代码(也就是上面图中的B区域,假如它是不可执行的话),将立即导致崩溃。现代操作系统(如 Linux 和 Windows)会将栈标记为不可执行内存,从而增加攻击的难度。这个时候即使我们把代码注入进内存,也无法是执行的。

2.3 Stack Canaries

我也不知道这个canaries要翻译成啥哈哈,"canary"就是在缓冲区之后的栈上放置一个特殊值,在函数退出之前,检查该特殊值是否被破坏。如果被破坏了就说明我们遇到了buffer overflow。

这个canaries的值是系统内部随机的,攻击者也很难知道是啥。GCC编译器提供了一个选项-fstack-protector,用于启用栈保护。

unix>./bufdemo-sp
Type a string:0123456
0123456
unix>./bufdemo-sp
Type a string:012345678
*** stack smashing detected ***

检测到了溢出就直接报错,用的就是这个canaries。

面向返回的编程攻击(Return-Oriented Programming Attacks, ROP攻击)

虽然我们有上面那些应对办法,但依然无法处理ROP攻击。ROP的攻击思想是直接使用现有代码,这些代码可以是程序本身的一部分,也可以是C库中的代码。这些代码必然在可执行的内存区域,所以不存在什么内存保护的说法。

攻击者在ROP攻击中利用了程序中已经存在的代码片段,这些片段被称为“gadgets”。他们仔细选择这些片段,使得这些片段的执行顺序能够实现攻击者的目的。这种攻击方法的关键在于利用程序中的现有代码,而不是像传统的缓冲区溢出攻击那样插入新的恶意代码。

尽管ROP攻击可以绕过栈随机化和非可执行内存的保护(绕过随机化是因为它不需要寻找注入的代码的地址,只需要去找现有的代码的地址;绕过内存保护也是类似道理,它不需要在stack中注入代码来执行,而是直接去找现有的可执行代码),但它不能克服栈保护(Stack Canaries),因为攻击者依然需要覆盖栈上的返回地址。

使用现有的代码,如何能达到攻击的目的呢?顶多就是把某些语句多执行几遍呗?并不是,对于machine code中的字节表示形式下的代码,攻击者可以从中进行截取,就可以可以做到“无中生有”。比如:

这里,原句最多就是一个赋值操作,但是如果我们截取从48后开始,那么就是另一个指令movq %rax, %rdi了。做到从48开始也很简单,原地址4004d9+3字节就来到了4004dc。就是通过这种拼凑的方式,可以得到攻击者想要的指令。

最后附一张常用指令对应的机器码,如果一个程序中包含了某一块,就可以被利用攻击。

这篇写了几个基于buffer overflow的攻击和保护措施,想更清楚理解可以去做attack lab,会有更清晰的认识~

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

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

相关文章

Python程序开发——第十一章 图形用户页面编程

目录 一、图形用户界面与tkinter二、tkinter的根窗口(一)根窗口的创建(二)根窗口的基本方法 三、几何布局管理器(一)pack布局(二)grid布局(三)place布局 四、…

【Android】将手机屏幕投屏到电脑上控制的解决方案

有没有听说scrcpy呢,是投屏工具,通过它就可以实现把手机屏幕投屏到电脑上了,有此帮助,离实现目标更近了一步。 首先,去开源站点GitHub那里下载获取scrcpy 压缩包,根据自己的电脑系统选择下载即可&#xff…

NginxTomcat架构的动静分离和负载均衡

目录 一、Tomcat的多实例部署 1.创建 kgc 和 benet 项目目录和文件 2.修改 Tomcat 主配置文件 3.客户端浏览器访问验证 二、NginxTomcat负载均衡架构原理 2.1 Nginx负载均衡的主要配置 2.2 NginxTomcat负载均衡的优点 三、NginxTomcat负载均衡实验 1.部署Nginx 负载…

SNP受邀参加“赛意力量·全国行”相聚合肥,RISE with SAP

伴随着全球数字化程度的不断加深,IT和OT逐步走向原生融合,以价值链重构倒逼产业转型的结构升级趋势已日益明显。在旺盛的市场需求与机遇下,企业的IT投入涌现出爆发式增长态势,对于IT系统“高效支撑以保障业务先赢”的能力要求已不…

Linux——权限

1.Linux权限的概念 Linux权限是指用于限制对文件和目录的访问的安全机制。文件和目录的权限由三个部分组成:所有者权限、同组用户权限和其他用户权限。每个部分又包括读、写、执行三种权限。这些权限决定了用户能否对文件或目录进行读、写、执行等操作。 2.Linux…

MinGW编译OpenCV 过程记录

1.下载源码opencv-3.4.10.zip ,可以在OpenCV官网下载Releases - OpenCV 解压缩如下: 2.下载Mingw64工具,需要支持posix 并设置系统环境目录,下载的文件名x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0.7z (可以在网上找) 3.使用Cmake工具构建…

Linux学习之分区和挂载磁盘配额

先分区然后格式化。 fdisk /dev/sdb开始分区。 输入p,然后按下Enter,可以查看当前设备的分区情况。 输入d,然后按下Enter,就可以删除上边的分区,要是有多个分区,会让你选择删除哪个分区。 输入n&…

MySQL注入-SQLi-Less3笔记

起手?id1给个参数看看反应 产生报错,关注后面的内容 //从报错信息中的1)就可以推断出SQL语句应该是WHERE XX(id)//那就需要考虑如何将 单引号和括号,提前关闭并且执行我们想要的语句就可以了 知道了语句,直接拼接 ?id1) and 12 union sel…

1。解释型语言和编译型语言

1、解释: 在计算机编程中,编译型语言和解释型语言是两种不同的语言类型。它们的主要区别在于代码的执行方式。编译型语言(Compiled Language)是指在程序运行之前需要经过编译器编译成可执行文件的语言。编译器会将编写好的代码转换…

基于matlab对于未校准立体图像校正(附源码)

一、前言 此示例说明如何计算两个未校准图像的校正,其中相机内禀函数未知。 立体图像校正将图像投影到公共图像平面上,以使相应的点具有相同的行坐标。此过程对于立体视觉很有用,因为 2-D 立体对应问题被简化为 1-D 问题。例如,…

java中跳出最外层的循环

public static void forTest() {int a 3;tab: for (int i 0; i < a; i) {System.out.println("我是i...." i);for (int j 0; j < a; j) {System.out.println("我是j...." j);if (j 1) {break tab;}}}}

linux用户权限相关内容查看

1 用户信息 创建用户一个名为 webuser 的账号&#xff0c;并填写相应的信息&#xff1a; rootiZ94fabhqhuZ:~# adduser webuser Adding user webuser ... Adding new group webuser (1000) ... Adding new user webuser (1000) with group webuser ... Creating home direc…

#systemverilog#进程控制问题#(三)进程监视

关于内建类:process SystemVerilog中内建了一种class,可以对进程进行访问和控制,此种class就是process,我们先来看下process类的原型: 图8 process类中定义了一个枚举变量state,表示当前进程的几种执行状态:FINISHED,RUNNING,WAITING,SUSPENDED,KILLED。 另外,还…

StarRocks--被 Databricks CEO 提及的数据库

Databricks 介绍 Databricks是一家美国的大数据独角兽公司&#xff0c;由 Apache Spark 的创建者所创立。Databricks 开源了 Delta Lake--基于 Apache Spark 的下一代数据湖存储引擎。Delta Lake 是目前市面上主流的数据湖存储引擎之一&#xff0c;与 Apache Hudi 和 Apache Ic…

十、less语法2

目录&#xff1a; 1.详解 1.详解 1.less 里面是可以直接进行数值运算 .box1{// 在less,所有数值都可以进行运算 &#xff0c;- * /width: 100px 100px;height:100px/2;background-color: #bfa;}2.在less中引入模块xx.less // import用来将其他的less引入到当前的less,相当于…

EasyCVR长时间运行后,级联到上级平台的通道无法播放是什么原因?

EasyCVR视频融合平台基于云边端一体化架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台支持多协议、多类型的设备接入&#xff0c;可实现的功能包括&#xff1a;视频直播、录像、回放、检索、云存储、告警上报、语音对讲、电子地图、集群以及平台级联等&am…

使echarts图例legend只选中一个(selectedMode)

例如&#xff1a;两个块选中第一个&#xff0c;第二个自动取消&#xff0c;选第二个&#xff0c;第一个取消 selectedMode: single,

有了PMP证书还有必要学习CSPM吗?CSPM含金量咋样?

建议学习&#xff0c;CSPM 相当于是 PMP 的本土化&#xff0c;是中国的项目管理&#xff0c;在中国自然还是本土的更适合国情&#xff0c;有CSPM还是更好找工作些。 CSPM认证6月1号才正式开启&#xff0c;现在是福利期&#xff0c;PMP持证者不用参加考试可以直接走换证流程&am…

Java【代码 16】Milvus向量库工具类和SeetaSDK获取人像向量和属性的工具类分享

Milvus向量库和SeetaSDK工具类分享 1.Milvus向量库工具类2.SeetaSDK工具类 1.Milvus向量库工具类 Milvus的Maven依赖&#xff1a; <dependency><groupId>io.milvus</groupId><artifactId>milvus-sdk-java</artifactId><version>2.1.0<…

利用Ettercap进行钓鱼攻击

原理:利用ARP协议特性,使用ettercap在内网不断的发送和抢答MAC地址,让受害者访问网关及DNS服务器实际均为攻击者的服务器。 前言&#xff1a;Ettercap是一款流行的网络安全工具&#xff0c;可用于网络嗅探、欺骗和分析攻击。它可以截获网络流量&#xff0c;使用户可以查看到传输…