缓冲区溢出及原理

  • 缓冲区
  • 缓冲区溢出
  • 缓冲区溢出的 C 程序实例
  • 缓冲区溢出错误的危害
  • Linux IA32 的进程映像
  • 缓冲区溢出的原理

缓冲区

缓冲区是一块用于存取数据的 内存,其位置和长度(大小)在编译时确定在程序运行时动态分配

缓冲区通常用于存储临时数据,例如字符串、数组或其他数据结构。

举个例子:

#include <stdio.h>

int main() {
    // 静态分配整数数组,编译时确定大小
    int staticIntArray[5] = {1, 2, 3, 4, 5};
    printf("Static Int Array: %d\n", staticIntArray[2]);

    // 动态分配整数数组,运行时确定大小
    int *dynamicIntArray = (int *)malloc(8 * sizeof(int));
    dynamicIntArray[0] = 10;
    dynamicIntArray[1] = 20;
    printf("Dynamic Int Array: %d\n", dynamicIntArray[1]);

    // 记得释放动态分配的内存
    free(dynamicIntArray);

    return 0;
}

这个示例展示了整数数组的缓冲区。在实际应用中,缓冲区常常与输入操作、文件读写等结合使用。

缓冲区可以在栈(stack)和堆(heap)中。

缓冲区溢出

缓冲区溢出就好比一个杯子倒太多的水,溢出来,这叫溢出。

在这里插入图片描述

向缓冲区拷贝数据 时,若 数据的长度大于缓冲区的长度,则多出的数据将覆盖该缓冲区之外的(高地址)内存,从而 覆盖了邻近的内存,这就是所谓的 缓冲区溢出错误

在这里插入图片描述

比如 C 语言中的字符串拷贝操作不检查字符串长度,则有可能发生缓冲区溢出错误。

缓冲区溢出的 C 程序实例

在这里插入图片描述

使用 gcc 编译器将文件编译并链接成一个名为 example 的可执行文件:gcc -o example ../src/example.c

这个命令会将 …/src/example.c 文件经过预处理、编译、汇编和链接的四个阶段,最终生成一个名为 example 的可执行文件,可以在终端中运行它。

在终端中运行 example 这个可执行文件:./example

程序输出如下:

address of BigBuffer=0xbffff35b
address of buf01=0xbffff37c
address of SmallBuffer=0xbffff38c
address of buf02=0xbffff39c
Original buf01='Buf01'
Original buf02='Buf02’

执行完 strcpy(SmallBuffer, BigBuffer) 后,程序输出:

buf01='Buf01’
buf02='67890123456789AB'

Original buf02='Buf02’buf02='67890123456789AB',说明 buf02的内容被覆盖了。

缓冲区溢出错误的危害

发生缓冲区溢出错误之后,

  • 如果邻近的内存是空闲的(不被进程使用),则对系统的运行无影响;
  • 但是,如果邻近的内存是被进程使用的数据,则可能导致进程的不正确运行;
  • 特别的,如果 被覆盖的是函数的返回地址,那么攻击者通过 精心构造被拷贝的数据(即 BigBuffer 的内容),则有可能执行攻击者期望的代码。

作为对目标进程的一种攻击方式,早在 1980 年代初期就有人开始讨论缓冲区溢出攻击了。但真正付诸实践、引起广泛关注并且导致严重后果的最早事件是 1988 年的 Morris 蠕虫事件

  • Morris 蠕虫对 Unix 系统中 fingerd 的缓冲区溢出漏洞进行攻击,导致 了6000多台机器被感染,损失在$100 000(10万)至$10 000 000(1千 万)之间。

1996 年,Aleph One 在 Phrack 杂志第49期发表的论文(Smashing The Stack For Fun And Profit)详细描述了 Linux 系统中栈的结构和如何利用基于栈的缓冲区溢出

  • Aleph One 的论文是关于缓冲区溢出攻击的开山之作,作为经典论文至今仍然被众多人研读。
  • Aleph One 给出了如何写执行一个 Shell 的(Exploit)代码的方法,并给这段代码赋予 Shellcode 的名称。

所谓编写 Shellcode,就是编译一段 使用系统调用 的简单的 C 程序,通过调试器抽取汇编代码,并根据需要修改这段汇编代码使之实现攻击者的目的。

Shellcode 是能实现攻击者目的,对目标(软件、硬件或网络等) 漏洞进行攻击的代码。

Linux IA32 的进程映像

为了进行缓冲区溢出攻击,必须分析 目标程序的进程映像

  • 进程映像是指进程在内存中的分布。
  • 可执行程序的进程映像与操作系统及版本有关,也与生成该程序的编译器有关。

进程有 4 个主要的内存区:代码区、数据区、堆栈区和环境变量区。

例程 1:mem_distribute.c

#include <stdio.h>
#include <string.h>

int fun1(int a, int b)
{
	return a+b;
}

int fun2(int a, int b)
{
	return a*b;
}

int x=10, y, z=20; //全局变量

int main (int argc, char *argv[])
{
	char buff[64], buffer02[32]; //局部变量
	int a=5,b,c=6; //局部变量
	printf((.text)address of\n\t fun1=%p\n\t fun2=%p\n\t main=%p\n”, fun1, fun2, main);
	printf((.data inited) address of\n\t x(inited)=%p\n\t z(inited)=%p\n", &x, &z);
	printf("(.bss uninited)address of\n\ty(uninit)=%p\n\n", &y);
	printf((stack) of\n\t argc=%p\n\t argv=%p\n\t argv[0]=%p\n", &argc, argv, argv[0]);
	printf("(Local variable) of\n\tbuff[64]=%p\n\tbuffer02[32]=%p\n", buff, buffer02);
	printf((Local variable) of\n\t a(inited) =%p\n\t b(uninit) =%p\n\t c(inited) =%p\n\n", &a, &b, &c);
	return 0;
}

生成可执行文件:gcc -o mem ../src/mem_distribute.c

执行: ./mem

输出如下:

在这里插入图片描述

由此可见:

  • 可执行代码 fun1, fun2, main 存放在内存的低地址 .text 代码区,且 **先定义的函数的代码 **存放在 内存的低地址
  • 全局变量 (x, y, z) 也存放在内存的低地址,起始地址高于可执行代码的地址。初始化的 全局变量存放在较 的地址 .data inited,而 未初始化的 全局变量位于较 的地址 .bss uninited
  • 局部变量 位于 内存高地址区0xbfff eexx),字符串变量放在高地址,其它变量先定义的放在低地址。
  • 函数的入口参数的地址(> 0xbfff efxx更高,位于函数的局部变量更高的地址之上。
  • main 函数从环境中获得参数,因此,环境变量位于最高的地址

栈底(最高地址)位于 0xc000 0000,环境变量和局部变量位于进程的栈区,函数的返回地址也位于进程的栈区。

Linux IA32 进程映像如下图:

在这里插入图片描述

有三种数据段:.text、.data 、.bss

  • .text(文本区),任何尝试对该区的写操作会导致段错误。 文本区存放了程序的代码,包括 main 函数和其他函数。
  • .data 和 .bss 都是可写的,它们保存全局变量。
    • .data 段包含已初始化的全局变量
    • .bss 段包含未初始化的全局变量

是一个 后进先出(LIFO) 数据结构,往低地址增长,它保存本地变量、函数调用等信息。一般用 push 和 pop 对栈进行操作。老版本的 Linux 系统的进程栈底(最高地址)固定,为 0xc0000000。 新版本的 Linux 系统采用了 栈底随机化技术,栈底(最高地址)动态变化。用以下命令 关闭栈底随机化sudo /sbin/sysctl -w kernel.randomize_va_space=0

  • 随着函数调用层数的增加,栈帧是一块块的向内存低地址方向延伸的;

  • 随着进程中函数调用层数的减少,即各函数的返回,栈帧\会一块块地被遗弃而向内存的高地址方向回缩。

的数据结构和栈不同,它是 先进先出(FIFO) 的数据结构,往高地址增长,主要用来保存程序信息和动态分配的变量。堆是通过 malloc 和 free 等内存操作函数分配和释放的。

函数被调用所建立的栈帧包含了下面的信息:

① 该 函数的返回地址。 IA32函数的返回地址都是存放在被调用函数的栈帧里。

② 调用函数的栈帧信息,即 栈顶和栈底(最高地址)

③ 为 该函数的局部变量 分配的空间。

④ 为 被调用函数的参数 分配的空间。

缓冲区溢出的原理

由于函数里局部变量的内存分配是发生在栈帧里的,所以如果在某一个函数内部定义了局部变量,则这个缓冲区变量所占用的内存空间是在该函数被调用时所建立的栈帧里。

由于对缓冲区的潜在操作(比如字串的复制)都是 从内存低地址到高地址 的,而 内存中所保存的函数返回地址往往就在该缓冲区的上方(高地址)——这是由于栈的特性决定的,这就为 覆盖函数的 返回地址 提供了条件。

在这里插入图片描述

当用大于目标缓冲区大小的内容来填充缓冲区时,就有可能 改写 保存在函数栈帧中的 返回地址,从而改变程序的执行流程,执行攻击者的代码。

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

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

相关文章

智能优化算法应用:基于吉萨金字塔建造算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于吉萨金字塔建造算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于吉萨金字塔建造算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.吉萨金字塔建造算法4.实验参数设…

新手小白-没有弱口令的挖掘思路

没有弱口令怎么挖&#xff1f;依稀记得有一个很老的思路叫做禁用js可以跳转后台&#xff0c;奈何学习两年半到现在从未发现一个这种漏洞。 不过&#xff0c;虽然不能直接搞到未授权后台登录&#xff0c;但是站有站的设计&#xff0c;小白有小白的打法&#xff01; 访问某URL ip…

Nuxt3 使用 pinia 基础

官方文档 一、安装 pnpm add pinia/nuxt二、配置 添加到 nuxt.config.js 中的 modules &#xff08;Nuxt 3&#xff09;或 buildModules &#xff08;Nuxt 2&#xff09;&#xff1a; // Nuxt 2 export default {buildModules: [[pinia/nuxt, { disableVuex: true }]], } /…

【单片机】MCU内存管理

keil中查看内存使用情况 Code-Data,RO-Data,RW-Data,ZI-Data的含义 Code-Data&#xff1a;代码占用的flash大小 RO-Data&#xff1a;[read-only data],只读常量大小&#xff08;const和#define&#xff09; RW-Data&#xff1a;[read write data],初始化了的变量大小 ZI-Da…

深入了解JavaScript事件绑定:实现高效可靠的事件处理

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;JavaScript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript-事件绑定方式 目录 事件绑定方式 什么是事件 DOM0级 事件 DOM0级事件…

PCB走线要“尽量”短_笔记

PCB走线要“尽量”短_笔记 关键影响要素作为“走线要尽量短”这条规则的补充的理论依据方波信号控制走线的特征阻抗 大家都知道两点之间直线最短&#xff0c;但是假如两点之间没有直线路径怎么办? 你会绕过去好还是换层好&#xff0c;尽量短就行&#xff1f;又有问题来了 究竟…

数据结构与算法编程题39

数组A[]中有 n 个整数&#xff0c;没有次序&#xff0c;数组从下标1开始存储&#xff0c;请写出顺序查找任一元素k的算法 &#xff0c;若查找成功&#xff0c;则返回元素在数组中的位置&#xff1b;若查找不成功&#xff0c;则返回 0。 /*数组A[]中有 n 个整数&#xff0c;没有…

分页存储管理系统的计算

在做题之前&#xff0c;一定要把逻辑地址和物理块号之间的关系弄清楚&#xff0c;可以看这篇&#xff1a; http://t.csdnimg.cn/92EmM 如果有时间&#xff0c;后续我也会进行整理&#xff01; 例题1&#xff1a; 在一个分页储存管理系统中&#xff0c;进程的逻辑地址空间占…

使用 javascript 模拟 git diff 命令实现文本文件差异比较

diff.html&#xff1a; <!DOCTYPE html> <html> <head><title>文件比较</title><meta charset"UTF-8"> </head> <body> <h1>文件比较</h1> <form><label for"file1">版本1&…

Python中读写CSV文件的深入探讨

目录 一、引言 二、如何读取CSV文件 三、如何写入CSV文件 四、处理大型CSV文件 五、总结 一、引言 CSV&#xff08;Comma-Separated Values&#xff09;文件是一种常见的逗号分隔值格式的文件&#xff0c;常用于存储和传输数据。在Python中&#xff0c;我们可以使用内置的…

手机充电器市场分析:预计2028年将达到82亿美元

在5G时代飞速发展的今天&#xff0c;随着科技的进步、应用的发展以及人们对以智能手机、平板电脑、智能穿戴设备为代表的智能终端设备追求越来越高的品质和功能&#xff0c;智能终端设备产品的更新换代的速度越来越快&#xff0c;这也将给全球智能终端充储电产品市场带来更大的…

计算机基础知识64

ForeignKey属性 to&#xff1a;设置要关联的表 related_name&#xff1a; 反向操作时&#xff0c;使用的字段名&#xff0c;用于代替原反向查询时的’表名_set’ related_query_name:反向查询操作时&#xff0c;使用的连接前缀&#xff0c;用于替换表名 to_field:设置要关联的表…

【黑马甄选离线数仓day09_会员主题域开发_DWD和DWM层】

拉链表流程 1.从ODS层获取增量数据(上一天新增和更新的数据) 2.拿着DWD原始拉链表数据 left join 增量数据 ,修改原始拉链中历史数据的结束时间 3.拿着left join 的结果集 union all 增量数据 4.把最新的拉链数据优先保存到DWD对应的临时表中 5.使用insertselect 方式把临时表中…

8000元投影仪值得买吗?选择一步到位当贝X5 Ultra不用担心白天看不见

随着生活方式的变化&#xff0c;现在越来越多家用将家里的电视机换成屏幕更大的投影仪&#xff0c;投影仪似乎要逐渐取代电视机在家庭中的位置&#xff1b;然而近日在抖音刷到河南广播电视台民生频道的一个视频&#xff1a;河南郑州一小伙花了八千多买了极米投影仪&#xff0c;…

Scala 从入门到精通

Scala 从入门到精通 数据类型 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http:…

LeetCode [中等]全排列(回溯算法)

46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 回溯法 采用试错的思想&#xff0c;它尝试分步的去解决一个问题。在分步解决问题的过程中&#xff0c;当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候&#xff0c;它将取消上一步甚至是上几步的计算&…

怎么对文件加密?文件加密软件操作保姆式演示!

大家是不是遇到过这种情况&#xff0c;文件一个不小心就被别人轻易外发出去&#xff0c;并且还是特别重要的内容。在企业中这种现象已经非常常见啦。 今天就给友友们&#xff0c;分享一款神器&#xff0c;它可以让你点点鼠标&#xff0c;就对企业的重要文件进行加密。 1、获取…

学习php中使用composer下载安装firebase/php-jwt 以及调用方法

学习php中使用composer下载安装firebase/php-jwt 以及调用方法 1、安装firebase/php-jwt2、封装jwt类 1、安装firebase/php-jwt composer require firebase/php-jwt安装好以后出现以下文件: 2、封装jwt类 根据所使用的php框架&#xff0c;在指定目录创建 Token.php <?ph…

llama.cpp部署(windows)

一、下载源码和模型 下载源码和模型 # 下载源码 git clone https://github.com/ggerganov/llama.cpp.git# 下载llama-7b模型 git clone https://www.modelscope.cn/skyline2006/llama-7b.git查看cmake版本&#xff1a; D:\pyworkspace\llama_cpp\llama.cpp\build>cmake --…

Angular 进阶之四:SSR 应用场景与局限

应用场景 内容丰富&#xff0c;复杂交互的动态网页&#xff0c;对首屏加载有要求的项目&#xff0c;对 seo 有要求的项目&#xff08;因为服务端第一次渲染的时候&#xff0c;已经把关键字和标题渲染到响应的 html 中了&#xff0c;爬虫能够抓取到此静态内容&#xff0c;因此更…