缓冲区溢出(栈溢出)
栈溢出(缓冲区溢出)
文章目录
- 栈溢出(缓冲区溢出)
- 堆栈:
- Call指令:
- 栈溢出(缓冲区溢出):
在了解栈溢出之前,我们需要了解几个概念:堆栈是什么以及汇编语言中的call指令的特点。
堆栈:
堆栈是一个特定的存储器或寄存器,其本质就是存储数据的内存。在实际应用中,堆栈会用于存储临时变、函数调用、中断切换时保存和恢复现场数据。
如图所示,堆栈就是内存中的某一片区域,每一个堆栈的内存单元都有唯一一个物理地址,且内存单元的大小都统一是4个字节大小。
并不是esp和ebp之间的范围才是堆栈,整个区域都是堆栈,而esp(栈顶)和esp(栈底)的作用只是定位数据的位置。
栈溢出就是发生在这样一个存储区域中。在了解了发生溢出的环境之后,了解溢出就相当于了解了一半了,另一半原因与使用的call指令有关。
Call指令:
call指令通常用于调用函数。用下面的例子理解。
cpu执行的程序
对应的堆栈变化
call指令在调执行时,先看call指令的长度和call所在的物理地址,这样才能计算出call指令的下一个指令地址。并且会把下一个指令地址存储到堆栈中。
之后cpu就会在堆栈中开辟出一段存储空间用于调用函数、存储临时变量。这里不细说。
函数调用时对堆栈的使用(图中用CCCCCCCC填充的内存单元就是缓冲区,存放局部变量就是在这里)
函数调用完后对堆栈的处理
小结:
1、函数调用完之后数据还是存储在堆栈当中,没有被真的删除,变化的只是esp和ebp指向的位置。
2、函数调用完之后,esp和ebp的位置会回到函数开始前的位置。也就是说我们的esp指向的位置是我们在调用函数执行call指令时所存在堆栈中的返回地址。
讲完call的特点和函数调用,现在就把栈溢出所需了解的知识点都知道了。
栈溢出(缓冲区溢出):
在了解完堆栈结构和call指令后,我们可以清楚的知道如果我们在调用一个函数时传入一个数据,如果这个数据大小超过我们所分配的缓冲区大小,那么就会造成缓冲区溢出。
堆栈图可以帮助我们更好的理解溢出的发生。
图中左边的堆栈可以看到给我们所分配的存储局部变量的位置是[ebp-14h]至[ebp-4]这个范围中,但是当我们输入的数据超过这个范围之后,多余的数据就被安排到了[ebp-adr]这个堆栈单元中了。[ebp-adr]这个单元中存放的是我们的返回地址(call语句的下一条语句的地址)。
缓冲区溢出的危害
缓冲区溢出最基本的影响就是会造成系统报错,更大的危害是利用缓冲区溢出执行非程序本身的操作。
通过修改存在堆栈中的返回地址,可以跳转到我们想要执行的程序的物理地址。我们也可以计算好堆栈的空间,然后输入一串我们编写好的具有特殊功能的Shellcode,通过返回地址调整esp指向位置去执行我们编写的shellcode。
缓冲区的利用方法
- 普通的数据传入:通过传入大量的数据造成溢出。(就像上面的图)
- 数组越界:通过往超过数组空间大小的位置传入数据,可以指定修改堆栈中的数据。
#include "stdafx.h"//版本:vc 6.0void HelloWorld(){printf("HelloWorld");getchar();
}void Fun(){int arr[5]={1,2,3,4,5};arr[6]=(int)HelloWorld;
}int main(int argc, char* argv[])
{Fun();return 0;
}
这串代码就是用到了数组越界的方法。我们声明的数组大小为五,所以在堆栈中分配的五个堆栈内存单元,但是我们向下标为六的数组空间中存入我们Hello World函数的地址,这就造成了越界。
当程序开始开始通过返回地址返回时,就会跳转到Hello World函数处,而Hello World函数并没有返回到主函数的返回地址,所以就会造成报错。
防止缓冲区溢出的方法—GS
防止缓冲区溢出和数组越界的方法还有很多,以上也仅是缓冲区溢出的基本知识。
缓冲区溢出(栈溢出)相关推荐
- 浅析缓冲区溢出漏洞的利用与Shellcode编写
文章目录 前言 汇编语言 寄存器 内存堆栈 CPU指令 函数调用 缓冲区溢出 栈溢出原理 栈溢出攻击 ShellCode 总结 前言 缓冲区溢出(Buffer Overflow)是计算机安全领域内既经 ...
- [转]浅谈缓冲区溢出之栈溢出
浅谈缓冲区溢出之栈溢出 By 浅墨 发表于 2012-12-02 有段时间没有用windows了,刚一开机又是系统补丁更新.匆匆瞥了一眼看到了"内核缓冲区溢出漏洞补丁"几个字眼.靠 ...
- 浅谈缓冲区溢出之栈溢出上
有段时间没有用windows了,刚一开机又是系统补丁更新.匆匆瞥了一眼看到了"内核缓冲区溢出漏洞补丁"几个字眼.靠,又是内核补丁.打完这个补丁后MD的内核符号文件又得更新了.于是抱 ...
- 缓冲区溢出之栈溢出利用(手动编写无 payload 的 Exploit)
0x01 介绍 Exploit 的英文意思就是利用,它在黑客眼里就是漏洞利用.有漏洞不一定就有Exploit(利用),有Exploit就肯定有漏洞.编写缓冲区溢出的Exploit分为3个方面:漏洞溢出 ...
- 缓冲区溢出(栈溢出)实验 之 JMP ESP
3.缓冲区溢出之JMP ESP 本文属于原创,如有错误请指正.其中引用他人的部分已经标出,如涉及版权问题请联系本人 这里不得不讲一讲JMP ESP的原理了,在实验之前我一直没看懂他是如何试下跳转ESP ...
- 缓冲区溢出漏洞攻击——Shellcode编写
一.实验内容 利用一个程序漏洞,编写shellcode,达成效果:蹦出对话框,显示"You have been hacked!(by JWM)" 二.实验原理 因为输入了过长的字符 ...
- 操作系统——缓冲区溢出
一.缓冲区溢出介绍 1988年,世界上第一个缓冲区溢出攻击–Morris蠕虫在互联网上泛滥,短短一夜的时间全世界6000多台网络服务器瘫痪或半瘫痪,不计其数的数据和资料被毁.造成一场损失近亿美元的空前 ...
- 堆栈的缓冲区溢出进不了系统_一文理解缓冲区溢出
1 引言 "缓冲区溢出"对现代操作系统与编译器来讲已经不是什么大问题,但是作为一个合格的 C/C++ 程序员,还是完全有必要了解它的整个细节. 计算机程序一般都会使用到一些内存,这 ...
- 分区起始位置参数溢出_IIS6.0缓冲区溢出漏洞深度分析(CVE-2017-7269)
漏洞描述 开启WebDAV服务的IIS6.0存在缓冲区溢出漏洞可以任意代码执行,目前针对 Windows Server 2003 R2 可以稳定利用.在WebDAV服务的ScStoragePathFr ...
最新文章
- 分层窗口输出文字时,会出现透明的洞。
- usb协议规范_你想了解的USB知识,都在这里了!
- 配置主机路由表(route)(两)
- 剑指offer 算法 (知识迁移能力)
- List与Map的遍历过程中删除元素
- Django基础——ORM字段和字段参数
- 字符动图_手把手教你做一个python+matplotlib的炫酷的数据可视化动图
- 包r语言_R语言交互式可视化包CanvasXpress
- chown -r oracle:oinstall /oracle,CentOS7安装Oracle12c图文详解
- 关于游戏的C 语言的课设报告,猜单词游戏C课程设计报告.doc
- k8s集群之master节点部署
- 乔丹LeCun李开复隔空对话:我们对智能一无所知;AI研究的12大趋势
- 升级nodejs的方法(3)
- pyautogui的两天坑moveto图像识别
- 离散数学集合论与数理逻辑基本概念
- 能编辑pdf文件的软件
- Android 图片压缩也即生成缩略图方法
- 阿里、美团、Oracle凭这套题不知道刷了多少人
- 冬瓜哥祝大家新年快乐!
- openCV-二值化,黑白图片
热门文章
- 重装系统后桌面只有一个回收站的解决方法
- 20230127英语学习
- AV1 概括性论文《An Overview of Core Coding Tools in the AV1 Video Codec》学习
- SVN如何切换账号 下
- java 循环遍历字符串_Java 程序迭代遍历字符串中的每个字符
- guestbook.php注入,Destoon 6.0 guestbook.php 通用SQL注入漏洞
- 机器学习 之 Haar特征
- java什么时候可能产生内存溢出_JAVA内存泄露和内存溢出
- 喜欢盗墓探险类的文章作品吗?这里为大家推荐一款类似的好玩的手游
- 【Unity 25】 Unity的UI基础1 (基本UI介绍,Text, Button)