缓冲区溢出攻击

缓冲区溢出攻击

  • 缓冲区溢出概述
    • 基础概念
    • 缓冲区溢出根源
    • 缓冲区溢出危害性&普遍性
  • 缓冲区溢出攻击原理
    • 内存分配模式
    • 缓冲区溢出攻击
      • 缓冲区溢出攻击原理
      • 缓冲区溢出攻击分类
      • 堆栈溢出
        • 堆栈相关知识
        • 攻击原理
    • 堆溢出攻击
      • 堆简介
      • 堆溢出
      • DWORD SHOOT
    • BSS段溢出
  • 缓冲区溢出攻击防御措施
    • 防御策略
    • 缓冲区溢出攻击防御技术

缓冲区溢出概述

基础概念

  • 缓冲区或缓存 (Buffer):用户在程序运行时在计算机中申请得的一段连续的内存,保存给定类型的数据.
  • 缓冲区溢出(Buffer Overflow):计算机程序向缓冲区内填充的数据位数超过缓冲区本身的容量,溢出的数据覆盖在合法数据上。
  • 缓冲区溢出攻击:向程序的缓冲区写入超出其长度的内容,造成缓冲区的溢出,从而破坏程序的正常执行流程,使程序转而执行其他的指令,以达到攻击的目的。

缓冲区溢出根源

  1. 溢出的根源在于编程:如果缓冲区被写满,而程序没有去检查缓冲区边界,也没有停止接收数据,就会发生缓冲区溢出。
  2. Unix和 Windows系统由于要实现更好的性能和功能,往往在数据段中动态地放入可执行的代码。
  3. C/C++语言问题:对数组下标访问边界不做检查或者少做检查。
  4. 程序员的编程习惯:忽略对输入数据进行严格的边界检查。

缓冲区溢出危害性&普遍性

  • 危害性:缓冲区溢出漏洞可以使一个匿名的Internet用户有机会获得一台主机的部分或全部的控制权.
  • 普遍性:
    1. 缓冲区溢出攻击占远程网络攻击的绝大多数,操作系统中超过50%的安全漏洞都是由内存溢出引起的。
    2. 任何平台、任何程序都可能存在缓冲区溢出的漏洞

缓冲区溢出攻击原理

内存分配模式

  • 内存分配模式分为三种:静态分配、堆栈分配、堆分配

  1. 静态分配:在进程创建时由系统一次性分配的整块静态内存,这块空间在进程运行期间保持不变。
  • 静态分配内容包括:正文( TEXT)段:指令、数据( DATA)段:初始化的全局静态数据、BSS段:未初始化的全局数据、栈空间

  1. 堆栈(Stack)分配:调用程序的地址信息,函数参数的内存分配。
  • 整个堆栈空间已在进程创建时分配好。进程刚启动时,堆栈空间是空的,里面无实体。
  • 在进程运行期间,对实体的堆栈分配是进程自行生成(压栈)和释放(弹出)实体,系统并不参与。
  • 只要压入的实体的总长度不超过堆栈空间大小,堆栈分配就与系统无关。若超过,就会引发堆栈溢出错误。

  1. 堆(Heap)分配:当进程需要生成实体时,向系统申请分配空间;不再需要该实体时,可以向系统申请回收这块空间。
  • 堆分配使用特定的函数:malloc();new()
  • 堆分配的空间利用率最高

  • 三种内存分配模式比较
静态分配栈分配堆分配
空间的生成进程创建时进程创建时即用即分配
实体生成时间进程创建时进程运行时进程允许时
实体生成者操作系统进程进程申请/系统实施
生命期永久临时完全可控
访问方式标识标识指针

在这里插入图片描述

  • 进程内存布局
    在这里插入图片描述
  • 进程内存布局
    在这里插入图片描述

缓冲区溢出攻击

  • 缓冲区溢出的目的在于扰乱具有某些特权的运行程序的执行流程,让攻击者取得程序的控制权
  • 两个步骤:
    1. 在程序的地址空间(堆栈、堆、BSS段等)里植 入攻击代码,或植入攻击代码所需的攻击参数(如果攻击代码已存在于目标程序中)。
    2. 改变程序的执行流程,转去执行攻击代码

缓冲区溢出攻击原理

  1. 代码注入攻击:攻击者向缓冲区写入的数据包含攻击代码(可执行的二进制代码,通常称为“shellcode”),当发生缓冲区溢出时,溢出的数据覆盖掉一个可执行程序的入口地址(如函数的返回地址,函数指针变量等),使得该地址指向shellcode,从而当程序试图通过该入口地址执行代码时,就会执行攻击者的shellcode。
  2. ROP 攻击:攻击代码已经在被攻击的程序中(通常是一些系统函数,如system(), exec()等),攻击者为攻击代码传递它所需要的参数,然后用一个系统函数的地址覆盖可执行代码的入口地址,使程序用预设的参数调用系统函数。比如用“cmd”作为参数调用system()函数,也称为ret2libc(Return-to-libc)

缓冲区溢出攻击分类

  1. 堆栈溢出
  2. 堆溢出
  3. BSS段溢出
  4. 格式化字符串溢出攻击

堆栈溢出

堆栈相关知识
  • SP(堆栈指针):指向堆栈的顶部;堆栈的增长方向:向下增长(向内存低地址)
    在这里插入图片描述
  • 堆栈布局
    在这里插入图片描述
  • 函数调用过程
    在这里插入图片描述
  • 假设有一个程序,其函数调用顺序如下:main() -> func_1() -> func_2() -> func_3()
    在这里插入图片描述

攻击原理
  • 攻击的原理:通过往程序缓冲区写入超过其边界的内容,造成缓冲区溢出,使得程序转而执行攻击者指定的代码,通常是为攻击者打开远程连接的ShellCode。
  • 关键点:
    • 存在能够被攻击的数据缓存
    • 要有被执行的攻击代码
      在这里插入图片描述

堆溢出攻击

堆简介

  • 当需要较大的缓冲区或在写代码时不知道包含在缓冲区中对象的大小,常常要使用堆。
  • 堆没有压栈和入栈操作,而是分配和回收内存。
  • C语言中使用malloc()和free()函数实现内存的动态分配和回收,C++语言使用new()和delete()函数来实现相同的功能。
  • 堆的特点:
    1. 堆的增长方向:从底到高(与栈相反)
    2. 堆的分配和释放可以由用户自由控制
    3. 堆的空间不一定连续
    4. 堆申请函数返回指向堆内存的指针,后续对于内存的读写等操作需要通过此指针进行
    5. 不同的系统有着不同的堆管理机制

  • 堆表位于堆区的起始位置用来索引堆块,表中包含索引堆块的大小、位置、状态等信息
    • 堆表分为两种:空闲双向链表Freelist(空表 128条)和快速单向链表Lookaside(快表最多只有四项)
  • 堆块分配可以分为三类:快表分配、普通空表分配和零号空表(free[0]分配)
  • 堆块的释放操作包括将堆块状态改为空闲,链入相应的堆表。
  • 堆块合并:当堆管理系统发现两个空闲堆块相邻时,就会进行堆块合并操作,包括,将堆块从链表中卸下、合并、调整新堆块块首信息、重新链入空表。

堆溢出

  • 堆溢出:指程序向某个堆块中写入的字节数超过堆块本身可使用的字节数,从而导致数据溢出,并覆盖到物理相邻的高地址的下一个堆块。
  • 前提条件:程序向堆上写入数据、写入的数据大小没有被良好地控制
  • 利用策略:覆盖与其物理相邻的下一个 chunk 的内容、利用堆中的机制(如 unlink 等 )来实现任意地址写入或控制堆块中的内容等效果,从而来控制程序的执行流。

DWORD SHOOT

  • DWORD SHOOT:用精心构造的数据去溢出下一个块的块首,改写块首中的前向指针和后向指针,这种能够向内存任意位置写入任意数据的机会叫DWORD SHOO
int remove (ListNode * node)
{
	node -> blink -> flink = node -> flink;
	node -> flink -> blink = node -> blink;
}

在这里插入图片描述
在这里插入图片描述

BSS段溢出

  • BSS段存放全局和静态的未初始化变量,变量与变量之间是连续存放的,没有保留空间。
  • 字符数组即是位于BSS段:
    static char buf1[16],buf2[16]
  • 如果先向buf2中写入16个字符A,之后再往buf1中写入24个B,由于变量之间是连续存放的,静态字符数组buf1溢出后,就会覆盖其相邻区域字符数组buf2的值。利用这一点,攻击者可以通过改写BSS中的指针或函数指针等方式,改变程序原先的执行流程,使指针跳转到特定的内存地址并执行指定操作

缓冲区溢出攻击防御措施

防御策略

  • 系统管理上的防御策略:
    • 关闭不需要的特权程序
    • 及时给程序漏洞打补丁
  • 程序开发中的防御策略:
    • 编写正确的代码
    • 非执行的缓冲区
    • 数组边界检查
    • 程序指针完整性检查

  • 关闭不需要的特权程序:缓冲区溢出只有在获得更高的特权时才有意义,关闭一些不必要的特权程序就可以降低被攻击的风险。
  • 及时给程序漏洞打补丁:及时补上漏洞,无疑极大的增强系统抵抗攻击的能力

  • 编写正确的代码: 在所有拷贝数据的地方进行数据长度和有效性的检查,确保目标缓冲区中数据不越界并有效。
  • 非执行的缓冲区:通过使被攻击程序的数据段地址空间不可执行,从而使得攻击者不可能执行被植入被攻击程序输入缓冲区的代码。
  • 数组边界检查:防止所有的缓冲区溢出的产生和攻击。方法包括:C的数组边界检查;内存存取检查(Purify 工具):使用“目标代码插入”技术来检查所有的内存存取;类型-安全语言。
  • 指针完整性检查:阻止由于函数返回地址或函数指针的改变而导致的程序执行流程的改变。

缓冲区溢出攻击防御技术

  • 两类防护技术
    • 被动防护技术:典型代表有插入canary 值、存储RETADDR 值、指针前后加guardzone 和低脂指针
    • 主动防护技术:更换动态链接库、加密指针型数据、随机化内存地址、去堆栈布局可预测性

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

npm install pubsub-js报错的解决汇总

我在练习谷粒商城P83时,选择分类时触发向后端请求选择分类catId绑定的品牌数据,发现前端控制台报错: "PubSub is not definded",找不到pubsub。 因为缺少pubsub包,所以开始安装此包。 于是在网上一顿搜索猛如虎&…

使用Python库Matplotlib绘制常用图表类型

使用Python库Matplotlib绘图 一、Matplotlib绘图参数设置1.1 设置分辨率和画布大小1.2 保存图片并设置边缘留白为紧凑型1.3 设置坐标轴标签1.4 画直线设置线宽和颜色1.5 画子图1.5.1 通过figure的add_subplot()画子图1.5.2 通过plt的subplots画子图 二、使用Matplotlib中scatte…

Geek Uninstaller丨轻盈免费无需安装,Win超强卸载工具

以前卸载软件用习惯了uninstall tool,今天试了一下geek,对比一下还是geek卸载软件更轻盈一点,没有太多冗杂的步骤。 Geek Uninstaller 是一款轻量级的软件卸载工具,它可以帮助用户彻底删除电脑上的软件,包括那些顽固的…

【因果推断python】8_线性回归模型2

目录 回归理论 非随机数据的回归 回归理论 我不打算深入研究线性回归是如何构建和估计的。然而,一点点理论将有助于解释它在因果推断中的力量。首先,回归解决了理论上的最佳线性预测问题。令 是一个参数向量: 线性回归找到最小化均方误差 (…

JavaScript倍速播放视频

F12打开开发者工具,打开控制台,输入这行代码,视频即可加速播放, 可以调整倍速(2,4,8,16) document. getElementsByTagName("video")[0]. playbackRate16

单片机建立自己的库文件(1)

文章目录 前言一、代码模块化是什么&#xff1f;二、使用步骤1.以LCD1602作为例子2.将LCD1602 相关的代码抽取到另外一个文件中 三、调用LCD1602.h1.新建一个工程项目&#xff0c;将LCD1602.h添加到工程中2.在主函数上加入 #include <LCD1602.h> 总结 前言 提示&#xf…

MACOS安装 vue 抱错解决方法npm ERR! code EACCESnpm ERR! syscall mkdirnpm ERR!

问题 在使用脚手架 vue-cli 创建 vue 工程的时候存在权限不足的情况下&#xff0c;报错&#xff1b; npm error code EACCES npm error syscall open npm error path /Users/ npm ERR! code EACCESnpm ERR! syscall mkdirnpm ERR! 解决方案&#xff1a; sudo npm cache cl…

Go跨平台编译

1.编译windows平台运行程序 # windows env GOOSwindows GOARCHamd64 go build main.go2.编译linux平台运行程序 # linux env GOOSlinux GOARCHamd64 go build main.go 3.编译macos平台运行程序 # macos env GOOSdarwin GOARCHamd64 go build main.go 编译结果:

VQAScore开启文本到视觉生成评估新篇章

随着生成式人工智能技术的飞速发展&#xff0c;如何全面评估生成内容的质量和与输入提示的一致性成为了一个挑战。在图像-文本对齐领域&#xff0c;传统的评估方法如CLIPScore存在局限性&#xff0c;尤其是在处理涉及多个对象、属性和关系的复杂提示时。它们通常基于简单的词袋…

Linux域名解析不了/网络不可达/虚拟机连接不了的问题

记录域名解析不了/网络不可达/虚拟机连接不了的问题问题 目录 文章目录 记录域名解析不了/网络不可达/虚拟机连接不了的问题问题1.首先确定已经连接上路由器(我的就是在这嗝屁了....)1.1 查看路由表1.2查看当前的网络连接状态&#xff0c;包括网关1.3查看网络接口的状态&…

机器学习笔记 - PyTorch 分布式训练概览

一、简述 对于大规模的数据集,只能进行分布式训练,分布式训练会尽可能的利用我们的算力,使模型训练更加高效。PyTorch提供了Data Parallel包,它可以实现单机、多GPU并行。 PyTorch 数据并行模块的内部工作原理 上面的图像说明了PyTorch 如何在单个系统中利用多个 G…

jmeter多用户登录并退出教程

有时候为了模拟更真实的场景&#xff0c;在项目中需要多用户登录并退出操作&#xff0c;大致参考如下 多用户登录前面已经实现&#xff1a;参考博文 多用户登录并退出jmx文件&#xff1a;百度网盘 提取码&#xff1a;0000 一、多用户退出操作 添加一个setUp线程组&#xff0…

pcdn如何规避运营商查封线路

在使用PCDN&#xff08;Private Content Delivery Network&#xff09;时&#xff0c;为了规避运营商查封线路&#xff0c;可以采取以下措施&#xff1a; 基于成本和宽带的调度&#xff1a;从CDN厂商的角度出发&#xff0c;考虑在不同业务量的地区进行调度&#xff0c;以减少在…

C#WPF数字大屏项目实战05--人员绩效展示

1、创建人员绩效实体类 2、定义视图模型中的属性 3、创建数据转换器 运行效果就是这样 4、绘制刻度 5、运行效果 6、小结 第1行StackPanel控件&#xff0c;里面放border和textblock 第2行ItemsControl控件&#xff0c;里面的ItemsSource绑定视图模型中的WorkerCompareList 第…

如何让数据标注

1.用Anacoda创建一个新的虚拟环境 2.进入虚拟环境 conda activate stu_data&#xff08;就是刚才创建的虚拟变量的名称&#xff09; 3.在此环境中安装labelimg pip install labelimg 4.进入labelimg 直接输入 labelimg 快捷键&#xff1a;D&#xff1a;下一个图片 A&#xff1a…

基于单片机的微型太阳能电站低功耗系统设计

摘 要 : 综合设计性实验是提高单片机类实验课程教学质量行之有效的手段 。 将实验课程内容结合社会热点问题而设计的实验教学案例&#xff0c;融合了单片机实验的所有知识点&#xff0c;提高了学生对实验课程的学习热情&#xff0c;激发了学生对实践教学的兴趣。 让学生通过对一…

java mybatis处理大数据量,开启和配置二级缓存,及注意事项,已解决

注意事项&#xff1a; 尽量避免使用下面方式写sql否则会降低服务器性能&#xff1a; mybatis二级缓存开启后&#xff0c;避免使用事务注解&#xff08;加上事务注解后二级缓存数据会导致两次访问不一致问题&#xff09;&#xff1a; 3. 返回的对象实体类&#xff0c;要实现Se…

FreeRTOS基础(三):动态创建任务

上一篇博客&#xff0c;我们讲解了FreeRTOS中&#xff0c;我们讲解了创建任务和删除任务的API函数&#xff0c;那么这一讲&#xff0c;我们从实战出发&#xff0c;规范我们在FreeRTOS下的编码风格&#xff0c;掌握动态创建任务的编码风格&#xff0c;达到实战应用&#xff01; …

用贪心算法进行10进制整数转化为2进制数

十进制整数转二进制数用什么方法&#xff1f;网上一搜&#xff0c;大部分答案都是用短除法&#xff0c;也就是除2反向取余法。这种方法是最基本最常用的&#xff0c;但是计算步骤多&#xff0c;还容易出错&#xff0c;那么还有没有其他更好的方法吗&#xff1f; 一、短除反向取…

一键分割视频并生成M3U8格式:高效管理视频内容,畅享流畅播放新体验

视频内容已成为我们日常生活和工作中的重要组成部分。无论是个人分享生活点滴&#xff0c;还是企业宣传产品与服务&#xff0c;视频都以其直观、生动的形式&#xff0c;吸引着我们的眼球。然而&#xff0c;随着视频内容的不断增多&#xff0c;如何高效、便捷地管理这些视频&…