栈越界攻击分析

2023-10-26

1,栈帧简介:

之前几期学习分享了关于栈帧系列知识的学习,我们知道函数调用过程中,每一个调用函数都是以栈帧为单位,在其内存空间上做相关操作,每一个调用函数的栈帧存有其返回地址,调用函数结束后,根据返回地址回到上层栈帧空间,直至main()函数的调用。

如下是栈帧的空间分布:

2,栈越界攻击介绍及原理

栈越界实质上来说,其实也即是上图缓存区域存放的数据超过其大小。缓冲区溢出是指当计算机程序向缓冲区内填充的数据位数超过了缓冲区本身的容量。溢出的数据覆盖在合法数据上。理想情况是,程序检查数据长度并且不允许输入超过缓冲区长度的字符串。但是绝大多数程序都会假设数据长度总是与所分配的存储空间相匹配,这就为缓冲区溢出埋下隐患。

 

操作系统所使用的缓冲区又被称为堆栈,在各个操作进程之间,指令被临时存储在堆栈当中,堆栈也会出现缓冲区溢出。 当一个超长的数据进入到缓冲区时,超出部分就会被写入其他缓冲区,其他缓冲区存放的可能是数据、下一条指令的指针,或者是其他程序的输出内容,这些内容都被覆盖或者破坏掉。可见一小部分数据或者一套指令的溢出就可能导致一个程序或者操作系统崩溃。

常见程序代码:

#include <stdio.h> 
#include <string.h> 
#include <iostream>
using namespace std; 
int main(int argc, char *argv[]) 
{ 
    char buf[10]; 
    strcpy(buf, argv[1]); 
    cout<<buf; 
    return 0; 
} 

连续输入10个字符就产生了溢出。

C语言常用的strcpy、sprintf、strcat 等函数都非常容易导致缓冲区溢出问题。

 

3,栈越界攻击危害及防范

缓冲区溢出的一个致命的使用就是让程序执行它本来不愿意执行的函数。这是一种常见的通过计算机网络攻击系统安全的方法。通常,输入给程序一个字符串,这个字符串包含一些可执行代码的字节编码,成为攻击代码。另外,还有一些字节会用一个指向攻击代码的指针覆盖返回地址。那么,执行ret指令的效果就是跳转到攻击代码。

 

一种攻击形式,攻击代码会使用系统调用启动一个外壳程序,给攻击者提供一组操作系统函数。

另一种攻击形式,攻击代码会执行一些未授权的任务,修复对栈的破坏,然后第二次执行ret指令,(表面上正常返回给调用者)。

那么如何防护/对抗缓冲区溢出攻击?

(1)栈随机化(主要受linux系统版本限制,老版本不支持栈随机化):使得栈的位置在程序每次运行时都有变化。为了在系统插入攻击代码,攻击者不但要插入代码,还需要插入指向这段代码的指针(指向攻击代码的首地址/栈地址),这个指针也是攻击字符串的一部分。产生这个指针需要知道这个字符串放置的栈地址。老的系统版本,如果在相同的系统运行相同的程序,栈的位置是相当固定的。所以黑客可以在一台机器上研究透系统上的栈是如何分配地址的,就可以入侵其它主机。

实现的方式:程序开始时,在栈上分配一段0~n字节之间的随机大小的空间。分配的范围n必须足够大,才能获得足够多样的栈地址变化,但是又要足够小,不至于浪费程序太多的空间。

(2)栈破坏检测(主要受GCC版本的限制,老的GCC版本不支持栈破坏检测):检测到何时栈被破坏。从strcpy等函数我们可以看到,破坏通常发生在当超越局部缓冲区的边界时。在C语言中,没有可靠的方法来防止对数组的越界写。但是,我们能够在发生了越界写的时候,并且,在其还没有造成任何有害结果之前,尝试检测到它,并且把程序终止。

实现的方

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

栈越界攻击分析 的相关文章

  • 遍历后加快数组查找速度?

    我有一个123MB大的int数组 它基本上是这样使用的 private static int data new int 32487834 static int eval int c int p data c 0 p data p c 1 p
  • 是否可以使静态控件透明?

    我正在尝试实现一个静态控件 该控件刷新 更改文本 以响应每秒发生一次的某个事件 由于我不想每秒绘制整个客户区域 所以我决定使用静态控件 现在的问题是父窗口被蒙皮 这意味着它有自定义位图作为背景 而静态控件没有适应 所以我正在寻找使静态控件的
  • 为什么更新外键后引用约束会不一致?

    抱歉 这个模糊的标题很难用一句话来描述 我有 2 个实体User and UserAddress 其中 User 有 2 个外键DefaultInvoiceAddressId and DefaultDeliveryAddressId和 Us
  • 如何使用 LINQ ForEach 更改 List

    我有一个List
  • 求 a 范围内的 pow(a^b)modN

    对于给定的b and N以及一系列a say 0 n 我需要找到ans 0 n 1 where ans i 没有a s为此pow a b modN i 我在这里搜索的是可能的重复pow a b modN对于一系列a 以减少计算时间 例子 i
  • 使用索引避免迭代器失效,维护干净的接口

    我创建了一个MemoryManager
  • 运行时两个注册之间的简单注入器基于动态上下文的注入

    我有一个使用 Simple Injector 进行命令处理程序注册的中介应用程序 并且注入和处理程序均已设置并完美运行 class DoWashingCommandHandler IRequestHandler
  • VS2010中VSHost.exe不断启动

    我正在 VS2010 中使用一个包含大量项目的解决方案 但它不断变得无响应 我注意到的一件事可能是一条线索 尽管我尚未开始任何调试 但 MyApplicationName vshost exe 不断出现在进程列表中 也许每当构建发生时它就会
  • 如何在 C++ 中从模板基类的构造函数调用模板超类的构造函数?

    我正在使用 sublimetext3 用 c 进行编程 我的程序有一个名为 Array 的超类和一个名为 IntArray 的子类 这两个类都是模板类 目前 我在编译该程序时遇到问题 它不断在我的 IntArray cpp 文件中给出错误
  • 命令中带空格的 Windows C 系统调用

    我无法使用名称和参数中的空格进行系统调用 例如 system c program files something example exe c my files example txt 我尝试过各种我知道的方法来逃避 但没有任何效果 我努力了
  • 用于 C/C++ 的独立跨平台 (Windows/Linux) 文件压缩?

    我正在寻找一个 最好是小的 C 或 C 开源库 我可以将其包含在我的 MIT 许可项目中 托管在 google 代码上 我是一名业余爱好 C C 程序员 所以我并不那么先进 但我只知道为名为 SA MP 的应用程序 适用于 Windows
  • Linux C++ 调试器

    我正在寻找完美的 Linux C 调试器 我不期望成功 但搜索应该提供丰富的信息 我是一个非常有能力的 gdb 用户 但 STL 和 Boost 很容易压垮我的调试技能 并不是说我无法深入了解数据结构的内部结构 而是它需要很长时间 我通常会
  • UWP - 绑定枚举差异

    我遇到了一个非常有趣的问题 假设 UWP 应用中有以下 XAML 页面内容
  • 如何让 PCRE 与 C++ 一起使用?

    这是一个新手问题 但我希望我能尽可能清楚地表达我的问题 我正在尝试用 C 进行模式匹配 我已经从以下位置下载了 PCRE 的 Win32 版本here http gnuwin32 sourceforge net packages pcre
  • 如何在 C++ 中初始化嵌套类的构造函数

    我在初始化嵌套类构造函数时遇到问题 这是我的代码 include
  • 剥离 OLE 标头信息 (MS Access / SQL Server)

    我有一个 C 应用程序需要支持二进制数据库内容 图像等 当使用 MS Access 或 MS SQL Server 时 此数据被包装在 OLE 对象内 如何去除此 OLE 标头信息 请注意 我不能只查找特定标签的开头 因为内容可以是 png
  • 如何进行平衡组捕获?

    假设我有这个文本输入 tes tR R abc aD mnoR xyz 我想提取 ff 输出 R abc R xyz D mnoR xyz R R abc aD mnoR xyz 目前 我只能使用平衡组方法提取组内的内容 如中所示msdn
  • 是否可以在 Eclipse 中为除 Java 之外的 Eclipse 编写插件?

    谁能帮我用c 写一个eclipse插件 weekens 和 celavek 感谢您提供的信息 我正在研究 JNI 并将尝试实现它 celavek 我们必须做什么样的主控 控制 在C 和java接口中处理是否风险更大 我的要求是在 Java
  • 从不同的线程访问对象

    我有一个服务器类 它基本上等待来自客户端的连接 在该类中 我创建了一个 NetworkStream 对象 以便能够从客户端接收字节 由于 NetworkStream Read 方法不是异步的 这意味着它将等到从客户端读取字节才能继续执行类似
  • Unity 错误“内部构建系统错误。后端退出,代码为 -1073740791。”摧毁/杀死了我的项目

    好吧 我可能在这里夸大了 但这是真的 当我开始打开它时 该项目由于错误 内部构建系统错误 后端退出 代码为 1073740791 而被破坏 应用程序 这个项目已经在Google Play上发布了 也许和设置有关 有人可以帮忙吗 完整错误 I

随机推荐

  • 仲裁器设计(二)-- Round Robin Arbiter 轮询调度算法

    作者 李虹江 原文 https mp weixin qq com s r nckE5nGz9mc5KqjPXKYg 本文授权转自IC加油站微信号 未经作者授权 严禁二次转载 上一篇老李讲了固定优先级仲裁器Fixed Priority Arb
  • 查看服务器当前内存cpu信息,查看服务器当前内存cpu信息

    查看服务器当前内存cpu信息 内容精选 换一换 查询系统当前可监控指标列表 可以指定指标命名空间 指标名称 维度 排序方式 起始记录和最大记录条数过滤查询结果 GET V1 0 project id metrics参数说明参数说明名称是否必
  • 阿里云机器学习PAI全新推出特征平台,助力AI建模场景特征数据高效利用

    推荐算法与系统在全球范围内已得到广泛应用 为用户提供了更个性化和智能化的产品推荐体验 在推荐系统领域 AI建模中特征数据的复用 一致性等问题严重影响了建模效率 阿里云机器学习平台 PAI 推出特征平台 PAI FeatureStore 在所
  • Java垃圾回收器的选择与配置

    一 垃圾回收器介绍 垃圾回收器 优点 缺点 针对 特性 常见组合方式 Serial 简单高效 单线程导致停顿较长 新生代 单线程 使用标记 复制算法 适合客户端模式 Serial 新生代 Serial Old 老年代 ParNew 多线程
  • 测试游戏帧率电脑温度的软件,游戏中显示帧数和温度方法_游戏画面中实时显示FPS帧数温度技巧...

    相信很多游戏玩家平时都是在用电脑玩游戏 而且大家也喜欢看一看自己在在游戏画面中实时的FPS帧数和温度信息 但是很网友对这个游戏画面中如何实时显示FPS帧数 频率 硬件温度不太清楚 下面智能手机网分享一下具体的操作方法 以便大家在玩游戏的时候
  • 内网渗透-windows信息收集(实战命令与工具)

    文章目录 一 前言 二 Windows信息收集 一 CMD 本机信息收集 二 CMD 域信息收集 三 Powershell命令信息收集 3 1 知识补齐 Get CimInstance 与 Get WmiObject区别 四 导出域信息 低
  • Matlab常见报错:错误使用 conv2不支持 N 维数组;cell类型数组不支持运算符

    一 错误使用 conv2不支持 N 维数组 错误样例 原因 提示错误使用 conv2不支持 N 维数组 可能是因为你读取的图像并不是灰度图像 而是RGB图像 有red green blue三种颜色通道也就是说是三维的矩阵 所以我们需要将图像
  • Java day04 运算符 隐式转换 补码反码 --判断和循环 day05--循环高级和数组 random

    运算符 01 算术运算符的基本用法 运算符 02 除法和取模 运算符 03 算术运算符 数值拆分 1 导包 找到Scanner这个类在哪 书写注意 写在类定义上面 import java util Scanner public class
  • 再次用construct 2制作游戏

    有了上一次用construct 2制作游戏的经验 这次的制作过程明显比上次简单了许多 我决定尝试一下新的游戏类型 希望能有新的突破 这一次 我制作的是类似雷电的飞机射击游戏 第一步 先选好背景 第二步 添加各种objects 第三步 设置航
  • 编程每日一题_C程序设计_年份闰年/平年判断

    描述 输入年份 判断该年份是平年还是闰年 普通闰年 年份数值为4的倍数 且不是100的倍数 世纪闰年 公历年份是整百数 且是400的倍数 正确解法一 嵌套判断 满足条件即输出判断结果 include
  • SQL注入时order by 后面加数字的作用

    此文章是记录本人对知识理解的随手笔记 内容不肯定百分百正确 如有错误望指出并谅解 结论 order by 后面加数字可以判断服务器在查询某个表时所查询的列数 原理 1 当sql查询语句为 select username password u
  • Ruby 2.1 GC策略

    对象管理主要涉及 Profiling support 增加了hook用于状态获取 专用API 分代式GC引入
  • c++将模板实现放在cpp,外部使用模板的方法(demo,gcc+msvc(动态库))

    参考https blog csdn net mincheat article details 77987740 一般情况 模板函数被外部其他引用会提示找不到函数 原因是 编译本身这个cpp的时候 没有发现有引用的地方 那么就不会被编译 而编
  • 使用QEMU+GDB调试Linux驱动程序

    前提 QEMU中已经添加了设备支持 能够正常insmod rmmod xxx ko 然后才能有接下来的调试 step1 打开如下编译选项然后编译Linux内核 CONFIG DEBUG INFO y CONFIG RANDOMIZE MEM
  • 毕业设计 - STM32公交站牌系统

    文章目录 1 简介 2 主要器件 2 1 ILI9320 2 2 串口GPRS模块 2 3 相关传感器 3 实现效果 4 设计原理 5 部分实现代码 6 最后 1 简介 Hi 大家好 学长今天向大家介绍一个单片机项目 STM32公交站牌系统
  • 简易agv小车自动导航控制协议

    1 获取地图栅格 2 实体化 转换 3 行走指令 调度优先处理 1 比如 前面 10 100米 行走指令序列 2 以 后面 0 10分钟 行走指令序列 4 处理栅格 5 转换计算成行走操作 1 速度 2 绝对移动位置 3 错误操作 4 阻碍
  • ubuntu的APT介绍

    介绍 apt是一款安装包管理工具 在ubuntu下可以使用apt命令进行软件包的安装 删除 清理等 ubuntu软件操作的相关命令 sudo apt get update 更新源 sudo apt get install package 安
  • 对AI未来和人类关系的一点思考!

    人 由大脑和身体组成 大脑里存在着人类的意识 身体给大脑提供能量 而这能量是由外界的食物提供的 从而 人体加工食物转化成能量 大脑加工能量 转化成意识 而意识表现在计算能力和创新能力两个方面 计算能力是量变的积累 创新能力是质变的飞跃 创新
  • OSPF实验

    我们坠落 破碎 掉入深渊 但我们终会被托起 被治愈 我们无所畏惧 OSPF部分实验 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 没关系的 大家都会做错选择 会莫名其妙掉眼泪 走在路上会突然崩溃 但这并不影响我们去看
  • 栈越界攻击分析

    1 栈帧简介 之前几期学习分享了关于栈帧系列知识的学习 我们知道函数调用过程中 每一个调用函数都是以栈帧为单位 在其内存空间上做相关操作 每一个调用函数的栈帧存有其返回地址 调用函数结束后 根据返回地址回到上层栈帧空间 直至main 函数的