栈溢出(缓冲区溢出)

文章目录

  • 栈溢出(缓冲区溢出)
    • 堆栈:
    • 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

​ 防止缓冲区溢出和数组越界的方法还有很多,以上也仅是缓冲区溢出的基本知识。

缓冲区溢出(栈溢出)相关推荐

  1. 浅析缓冲区溢出漏洞的利用与Shellcode编写

    文章目录 前言 汇编语言 寄存器 内存堆栈 CPU指令 函数调用 缓冲区溢出 栈溢出原理 栈溢出攻击 ShellCode 总结 前言 缓冲区溢出(Buffer Overflow)是计算机安全领域内既经 ...

  2. [转]浅谈缓冲区溢出之栈溢出

    浅谈缓冲区溢出之栈溢出 By 浅墨 发表于 2012-12-02 有段时间没有用windows了,刚一开机又是系统补丁更新.匆匆瞥了一眼看到了"内核缓冲区溢出漏洞补丁"几个字眼.靠 ...

  3. 浅谈缓冲区溢出之栈溢出上

    有段时间没有用windows了,刚一开机又是系统补丁更新.匆匆瞥了一眼看到了"内核缓冲区溢出漏洞补丁"几个字眼.靠,又是内核补丁.打完这个补丁后MD的内核符号文件又得更新了.于是抱 ...

  4. 缓冲区溢出之栈溢出利用(手动编写无 payload 的 Exploit)

    0x01 介绍 Exploit 的英文意思就是利用,它在黑客眼里就是漏洞利用.有漏洞不一定就有Exploit(利用),有Exploit就肯定有漏洞.编写缓冲区溢出的Exploit分为3个方面:漏洞溢出 ...

  5. 缓冲区溢出(栈溢出)实验 之 JMP ESP

    3.缓冲区溢出之JMP ESP 本文属于原创,如有错误请指正.其中引用他人的部分已经标出,如涉及版权问题请联系本人 这里不得不讲一讲JMP ESP的原理了,在实验之前我一直没看懂他是如何试下跳转ESP ...

  6. 缓冲区溢出漏洞攻击——Shellcode编写

    一.实验内容 利用一个程序漏洞,编写shellcode,达成效果:蹦出对话框,显示"You have been hacked!(by JWM)" 二.实验原理 因为输入了过长的字符 ...

  7. 操作系统——缓冲区溢出

    一.缓冲区溢出介绍 1988年,世界上第一个缓冲区溢出攻击–Morris蠕虫在互联网上泛滥,短短一夜的时间全世界6000多台网络服务器瘫痪或半瘫痪,不计其数的数据和资料被毁.造成一场损失近亿美元的空前 ...

  8. 堆栈的缓冲区溢出进不了系统_一文理解缓冲区溢出

    1 引言 "缓冲区溢出"对现代操作系统与编译器来讲已经不是什么大问题,但是作为一个合格的 C/C++ 程序员,还是完全有必要了解它的整个细节. 计算机程序一般都会使用到一些内存,这 ...

  9. 分区起始位置参数溢出_IIS6.0缓冲区溢出漏洞深度分析(CVE-2017-7269)

    漏洞描述 开启WebDAV服务的IIS6.0存在缓冲区溢出漏洞可以任意代码执行,目前针对 Windows Server 2003 R2 可以稳定利用.在WebDAV服务的ScStoragePathFr ...

最新文章

  1. 分层窗口输出文字时,会出现透明的洞。
  2. usb协议规范_你想了解的USB知识,都在这里了!
  3. 配置主机路由表(route)(两)
  4. 剑指offer 算法 (知识迁移能力)
  5. List与Map的遍历过程中删除元素
  6. Django基础——ORM字段和字段参数
  7. 字符动图_手把手教你做一个python+matplotlib的炫酷的数据可视化动图
  8. 包r语言_R语言交互式可视化包CanvasXpress
  9. chown -r oracle:oinstall /oracle,CentOS7安装Oracle12c图文详解
  10. 关于游戏的C 语言的课设报告,猜单词游戏C课程设计报告.doc
  11. k8s集群之master节点部署
  12. 乔丹LeCun李开复隔空对话:我们对智能一无所知;AI研究的12大趋势
  13. 升级nodejs的方法(3)
  14. pyautogui的两天坑moveto图像识别
  15. 离散数学集合论与数理逻辑基本概念
  16. 能编辑pdf文件的软件
  17. Android 图片压缩也即生成缩略图方法
  18. 阿里、美团、Oracle凭这套题不知道刷了多少人
  19. 冬瓜哥祝大家新年快乐!
  20. openCV-二值化,黑白图片

热门文章

  1. 重装系统后桌面只有一个回收站的解决方法
  2. 20230127英语学习
  3. AV1 概括性论文《An Overview of Core Coding Tools in the AV1 Video Codec》学习
  4. SVN如何切换账号 下
  5. java 循环遍历字符串_Java 程序迭代遍历字符串中的每个字符
  6. guestbook.php注入,Destoon 6.0 guestbook.php 通用SQL注入漏洞
  7. 机器学习 之 Haar特征
  8. java什么时候可能产生内存溢出_JAVA内存泄露和内存溢出
  9. 喜欢盗墓探险类的文章作品吗?这里为大家推荐一款类似的好玩的手游
  10. 【Unity 25】 Unity的UI基础1 (基本UI介绍,Text, Button)