缓冲区溢出攻击

缓冲区溢出攻击

  • 缓冲区溢出概述
    • 基础概念
    • 缓冲区溢出根源
    • 缓冲区溢出危害性&普遍性
  • 缓冲区溢出攻击原理
    • 内存分配模式
    • 缓冲区溢出攻击
      • 缓冲区溢出攻击原理
      • 缓冲区溢出攻击分类
      • 堆栈溢出
        • 堆栈相关知识
        • 攻击原理
    • 堆溢出攻击
      • 堆简介
      • 堆溢出
      • 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 和低脂指针
    • 主动防护技术:更换动态链接库、加密指针型数据、随机化内存地址、去堆栈布局可预测性

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

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

相关文章

Frida使用与解题

对于 Android 逆向,首先需要熟悉对于 adb 基本命令使用 1.C:\Users\sun>adb shell ASUS_I003DD:/ # getprop ro.product.cpu.abi x86_64 查看架构 exit 退出 2. adb push "E:\reverse\ida\IDA_Pro_7.7\IDA_Pro_7.7\IDA_Pro_7.7\dbgsrv\android_x86_ser…

LeetCode162寻找峰值元素

题目描述 峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。你可以假设 nums[-1] nums[n] -∞ 。你必须实现时间复杂度为…

09Linux GDB学习笔记

Linux GDB使用 目录 文章目录 Linux GDB使用先编译文件1.检查安装1.1 安装GDB 2.启动GDB3.退出GDB4.设置断点4.1 在指定行号处设置断点4.2 在指定函数名处设置断点4.3 在指定源文件和行号处设置断点 4.4查看断点信息4.5删除断点5.运行5.1 <font color#ff0000>逐过程&am…

认识JAVA中的异常

目录&#xff1a; 一. 异常概念与体系结构 二. 异常的处理 三. 自定义异常类 一. 异常概念与体系结构: 1 异常的概念:在 Java 中&#xff0c;将程序执行过程中发生的 不正常行为 称为异常&#xff0c; 如&#xff1a;算数异常&#xff1a; ArithmeticException System.out.pri…

大豆、棉花深度学习数据集大合集

最近收集了一大波关于大豆和棉花的深度学习数据集&#xff0c;主要有叶片的识别、分类、计数以及病害检测等。 数据集的价值 科研价值&#xff1a;这些数据集为植物学、农业信息技术、机器学习等领域的科研人员提供了宝贵的资源。它们可以用于训练和优化各种深度学习模型&…

CCF CAT- 全国算法精英大赛(2024第二场)往届真题练习 4 | 珂学家

前言 餐馆 思路&#xff1a;可撤销的0-1背包 考察了多个知识点&#xff0c;包括 差分技巧离线思路0-1背包 不过这题卡语言&#xff0c;尤其卡python import java.io.*; import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream;public…

C#开发的应用升级更新服务器端工具 - 开源研究系列文章 - 个人小作品

笔者开发过一些小应用&#xff0c;然后这些应用就需要有升级更新的功能&#xff0c;但是如果每个都集成进去也行&#xff0c;但是就是得写死更新的代码了。于是就想写一个应用升级更新的管理器&#xff0c;以前看到过Github上有一个AutoUpdate.Net&#xff0c;不过它那个要集成…

2024最新VMware Workstation Pro下载教程

自从2024年5月份之后&#xff0c;VMware workstation player就不能直接在vm官网下载,需要到broadcom博通网站上下载 下面介绍最新下载步骤&#xff1a; 百度直接搜索vmware 进入官网点击Workstation Pro链接 博通注册对应的账号 现在下载都需到博通注册对应的账号 登录邮…

展台设计需要注意哪些问题

一、明确设计目标与主题 在设计之前需要明确展台设计目标和主题。设计目标是指展台设计所要达到的目的和效果&#xff0c;提高企业知名度、促进产品销售等&#xff1b;设计主题则是展台设计的核心和灵魂&#xff0c;贯穿整个展台设计的风格和形式。参展企业需要清晰地界定设计目…

Linux常用环境Docker安装

一、mysql安装 简单安装 docker run -d \--name mysql \-p 3306:3306 \-e TZAsia/Shanghai \-e MYSQL_ROOT_PASSWORD123 \mysql mysql容器本地挂载 cd /usr mkdir mysql cd mysql/ mkdir data mkdir conf mkdir init可以手动导入自己的数据库信息 docker run -d \--name mys…

@Transactional事务注解内含乾坤?

文章目录 前置知识实战1、无事务操作2、事务操作 总结 前置知识 MyBatis中的工作原理 读取配置文件&#xff1a;数据库连接信息、事务管理信息以及映射文件的位置加载映射文件&#xff1a;加载Mapper.xml这些映射文件&#xff0c;解析其中的 SQL 语句和结果映射信息创建 SqlS…

如何在Windows 10上的命令提示符下更改目录?这里提供方法

如果你刚开始在Windows 10上使用命令提示符,你需要知道如何更改目录。 如何在Windows上打开命令提示符 随着你对Windows 10上的命令提示符越来越熟悉,你需要学习的第一件事是如何更改操作系统文件系统中的目录。有几种方法可以做到这一点,所以我们将带你了解它们。 注意:…

JCR一区级 | Matlab实现TCN-LSTM-MATT时间卷积长短期记忆神经网络多特征分类预测

JCR一区级 | Matlab实现TCN-LSTM-MATT时间卷积长短期记忆神经网络多特征分类预测 目录 JCR一区级 | Matlab实现TCN-LSTM-MATT时间卷积长短期记忆神经网络多特征分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.JCR一区级 | Matlab实现TCN-LSTM-MATT时间卷积长短…

问界新M7 Ultra仅售28.98万元起,上市即交付

5月31日&#xff0c;问界新M7 Ultra正式上市。发布会上&#xff0c;鸿蒙智行旗下多款产品交出最新答卷——问界新M5上市1个月大定突破2万台&#xff1b;智界S7位列30万纯电轿车4月交付量NO.3&#xff1b;问界M9上市5个月大定突破9万台。其中&#xff0c;作为中国高端豪华SUV市场…

STM32CubeMX重新生成代码时如何避免用户代码被覆盖

STM32CubeMX对于在STM32芯片上开发程序非常方便&#xff0c;但是有时发现&#xff1a;使用STM32CubeMX生成keil工程后&#xff0c;在这个工程上开发了一段时间&#xff0c;然后又有外设需要配置&#xff0c;这时使用STM32CubeMX打开MX工程开启外设&#xff0c;最后重新生成keil…

项目启动 | 宏昌电器牵手盘古信息,数字化制造引领企业高质量发展

随着时代的发展&#xff0c;数字化转型已成为实现企业持续增长和塑造竞争优势不可或缺的关键因素。浙江宏昌电器科技股份有限公司&#xff08;以下简称为“宏昌电器”&#xff09;围绕企业战略发展需求&#xff0c;积极加速数字化转型升级进程&#xff0c;以数字化力量推动公司…

docker-compose jira、bugzilla

一、jira 同这篇文章&#xff1a; linux docker 部署破解版本jira:8.4.0——测试体验(非商用)_jira docker-CSDN博客 直到构建完破解版本的镜像就可以了&#xff5e; 二、bugzilla 1. 拉取镜像&#xff1a; 官网镜像搜索bugzilla&#xff0c;第一个就是&#xff1a; 直接…

基于51单片机的电子时钟设计

在单片机技术日趋成熟的今天&#xff0c;其灵活的硬件电路和软件电路的设计&#xff0c;让单片机得到广泛的应用&#xff0c;几乎是从小的电子产品&#xff0c;到大的工业控制&#xff0c;单片机都起到了举足轻重的作用。单片机小的系统结构几乎是所有具有可编程硬件的一个缩影…

计算机图形学入门04:视图变换

1.MVP变换 将虚拟场景中的模型投影到屏幕上&#xff0c;也就是二维平面上&#xff0c;需要分三个变换。 1.首先需要知道模型的位置&#xff0c;也就是前面提到的基本变换&#xff0c;像缩放、平移&#xff0c;旋转&#xff0c;也称为模型(Model)变换。 2.然后需要知道从…

归并排序C++代码详解,思路流程+代码注释,带你完全学会归并排序

归并排序 归并排序是一种经典的排序算法&#xff0c;属于分治算法的一种。其核心思想是将一个大问题分解成若干个较小的子问题来解决&#xff0c;然后根据子问题的解构建原问题的解。在排序问题中&#xff0c;归并排序将数组分成两半&#xff0c;分别对这两半进行排序&#xf…