缓冲区溢出——栈溢出

1、缓冲区概念
缓冲区(buffer)又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。

使用缓冲区有两个好处:
1、减少实际物理读写次数
2、缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数

比如我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。

比如从网上下电影,你不能下一点点数据就写一下硬盘,而是积攒一定量的数据以后一整块一起写,不然硬盘都要被你玩坏了

假设要实现一个功能:接受用户键入的字符串,并赋值给一个字符串变量其过程如下:
1:在内存中开辟一个”键盘缓冲区“接受用户键入的字符串
2:把缓冲区中的字符串copy到程序中定义的字符串变量指向的内存空间(也就是赋值过程)
也就是说,为了完成最终目标:把字符串放入字符串变量指向的空间,需要暂时把字符串放入“键盘缓冲区”的空间。
这里,缓冲区解决的问题不是“时间”,而是“空间”,为数据找一个暂存地。

所以,缓冲区就是一块内存区,它用在输入输出设备和CPU之间,用来缓存数据。它使得低速的输入输出设备和高速的CPU能够协调工作,避免低速的输入输出设备占用CPU,解放出CPU,使其能够高效率工作。

2、缓冲区溢出概念
缓冲区溢出,简单的说就是计算机对接收的输入数据没有进行有效的检测(理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符),向缓冲区内填充数据时超过了缓冲区本身的容量,而导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据。操作系统所使用的缓冲区,又被称为“堆栈”,在各个操作进程之间,指令会被临时储存在“堆栈”当中,“堆栈”也会出现缓冲区溢出。所以,栈溢出是缓冲区溢出的一种。

3、栈溢出
栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致与其相邻的栈中的变量的值被改变。栈溢出漏洞轻则可以使程序崩溃,重则可以使攻击者控制程序执行流程。此外,我们也不难发现,发生栈溢出的基本前提是

-程序必须向栈上写入数据。
-写入的数据大小没有被良好地控制。

栈溢出中比较重要的几个步骤

  • 寻找危险函数
    通过寻找危险函数,我们快速确定程序是否可能有栈溢出,以及有的话,栈溢出的位置在哪里。常见的危险函数如下

    • 输入:
      • gets,直接读取一行,忽略’\x00’
      • scanf
      • vscanf
    • 输出:
      • sprintf
      • 字符串
      • strcpy,字符串复制,遇到’\x00’停止
      • strcat,字符串拼接,遇到’\x00’停止
      • bcopy
  • 确定填充长度
    这一部分主要是计算我们所要操作的地址与我们所要覆盖的地址的距离。常见的操作方法就是打开 IDA,根据其给定的地址计算偏移。一般变量会有以下几种索引模式

  • 相对于栈基地址的的索引,可以直接通过查看EBP相对偏移获得

  • 相对应栈顶指针的索引,一般需要进行调试,之后还是会转换到第一种类型。
  • 直接地址索引,就相当于直接给定了地址。

    一般来说,我们会有如下的覆盖要求

  • 覆盖函数返回地址,这时候就是直接看 EBP 即可。
    覆盖栈上某个变量的内容,这时候就需要更加精细的计算了。

  • 覆盖 bss 段某个变量的内容。
  • 根据现实执行情况,覆盖特定的变量或地址的内容。

参考网页:
http://www.cnblogs.com/pricks/p/3821832.html
https://ctf-wiki.github.io/ctf-wiki/pwn/stackoverflow/stackoverflow_basic/

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Q版缓冲区溢出教程 目录 写在前面 2 目录 4 前言 6 作者简介 6 主要角色简介 6 阅读指南 6 第一章、Windows下堆栈溢出入门 8 1.1 梦,已经展开 8 1.2 啤酒和杯子――缓冲区溢出原理 8 1.3 神秘的Windows系统 10 1.4 ShellCode编写简介 17 1.5 窥豹一斑――本地缓冲区溢出简单利用 21 1.6 小结——摘自小强的日记 28 1.7 首次实战――FoxMail溢出漏洞编写 29 1.8 牛刀小试――Printer溢出漏洞编写 41 1.9 JMP /CALL EBX——另一种溢出利用方式 42 1.10 拾阶而上——IDA/IDQ溢出漏洞编写 55 课后解惑 58 第二章、Windows下ShellCode编写初步 60 2.1 ShellCode是什么? 60 2.2 简单的例子——编写控制台窗口的ShellCode 63 2.3 ShellCode通用性的初步分析 78 2.4 弹出Windows对话框ShellCode的编写 82 2.5 添加用户ShellCode的编写 88 课后解惑 98 第三章、后门的编写和ShellCode的提取 100 3.1 预备知识 101 3.2 后门总体思路 121 3.3 Telnet后门的高级语言实现 125 3.4 生成ShellCode 136 3.5 进一步的探讨 156 3.6 反连后门ShellCode的编写 160 课后解惑 166 第四章 Windows下堆溢出利用编程 168 4.1 堆溢出初探 168 4.2 RtlAllcoateHeap的失误 170 4.3 实例——Message堆溢出漏洞的利用 191 4.4 RtlFreeHeap的失误 197 4.5 堆溢出的其他利用方式 204 4.6 实例——JPEG处理堆溢出漏洞的利用 208 课后解惑 215 第五章 ShellCode变形编码大法 217 5.1 为什么要编码 217 5.2 简单的编码——异或大法 221 5.3 简便的变形——微调法 231 5.4 直接替换法 233 5.5 字符拆分法 239 5.6 内存搜索法 247 5.7 搜索实例——Serv_U漏洞的利用 249 5.8 “计算与你同行”—— Computing & Society 257 课后解惑 258 第六章 ShellCode编写高级技术 260 6.1 通用ShellCode的编写 260 6.2 ShellCode的高效提取技巧 285 6.3 ShellCode的高级功能 294 课后解惑 305 第七章、漏洞的发现、分析和利用 308 7.1 CCProxy 漏洞的分析 308 7.2 黑盒法探测漏洞和Python脚本 319 7.3 白盒法和IDA分析漏洞 333 尾声 347
缓冲区溢出攻击是一种常见的网络安全漏洞,它利用了程序中的缓冲区溢出漏洞,向缓冲区输入超出其容量的数据,从而攻击系统。 首先,为了检测缓冲区溢出攻击,我们可以使用静态分析和动态分析两种方法。静态分析是通过对程序的源代码或二进制代码进行分析,寻找潜在的缓冲区溢出漏洞。动态分析则是在程序的执行过程中监控缓冲区的使用情况,如果发现缓冲区溢出现象,就进行警报或阻止攻击。 其次,剖析缓冲区溢出攻击意味着研究攻击者利用的具体漏洞和攻击方式。攻击者一般会通过向缓冲区输入过长的数据,覆盖缓冲区之后的重要数据或者修改程序的返回地址,进而注入恶意代码并执行。在剖析过程中,我们需要深入了解攻击者的手法和原理,以便更好地进行防御。 最后,预防缓冲区溢出攻击是非常重要的。首先,编写安全的代码是关键。程序员需要对输入进行合理的验证和范围检查,确保输入数据不会超过缓冲区的容量。其次,使用编程语言或开发框架提供的安全函数。这些安全函数可以自动检测和防止缓冲区溢出攻击。此外,定期更新和修复操作系统和应用程序中的漏洞,以防止攻击者利用已知的漏洞进行攻击。 总之,缓冲区溢出攻击是一种常见但可预防的网络安全威胁。通过检测、剖析和预防,可以有效地保护系统和数据的安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值