12

缓冲区溢出原理

 3 years ago
source link: https://zhuanlan.zhihu.com/p/112683773
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

缓冲区溢出原理

只是一个小透明。

简单说下其原理:
通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,进而运行精心准备的指令,以达到攻击的目的。

v2-1b6a999604597d4bdc536eb59c2955aa_720w.jpg

如上图,程序的缓冲区比作一个个格子(内存单元),每个格子中存放不同的东西,有的是命令,有的是数据,当程序需要接收用户数据,程序预先为之分配了4个格子(上图中黄色的0~3号格子)。

按照程序设计,就是要求用户输入的数据不超过4个。

而用户在输入数据时,假设输入了16个数据,而且程序也没有对用户输入数据的多少进行检查(这种情况太常见了,windows系统本身就出过n个缓冲区溢出漏洞),就往预先分配的格子中存放,这样不仅4个分配的格子(内存)被使用了,其后相邻的12个格子中的内容都被新数据覆盖。

一般情况下后面的格子是可以被当成代码执行的,嘿嘿,那么好玩的事情来了,我们可以精心制造一段指令,比如格式化硬盘指令来让cpu执行。

v2-48df59365aad345eb680d0da0cc56ab3_720w.jpg

接下来通过一个实例来演示如何利用缓冲区溢出漏洞来攻击目标主机

• 漏洞测试环境介绍
操作系统:winxp(被攻击方,在虚拟机里), win7(攻击方)
漏洞挖掘软件:FTPFuzz,这货可以构建任意数据结合ftp命令发送给服务器,查找溢出漏洞用的
漏洞测试目标软件:GoodFTP Server ,这是一个架设FTP服务器的软件
辅助软件:OllyICE ,用来跟踪程序的运行过程,居家旅行杀人灭口破解程序必备 - -

  1. 首先,用OllyIce打开GoodFTP,因为程序接受到ftp命令是一串文本,所以会用到一个名为strstr的api函数,所谓api函数就是操作系统课上讲的系统调用了。

2. 然后给strstr下个断点,让程序运行到这里的时候暂停下来,以便观察情况。如下图,左起第一列是内存地址(虚地址),第二第三列是机器码与对应的汇编代码,最后一列就是寄存器里的内容了

3. 请出刚才提到的漏洞挖掘软件——FTPFuzz,设置一下让它不断向目标主机的21号端口发送AAAAAAAAAAAA……

4. 回到OllyIce中,因为程序收到数据后会将之当成文本处理,这时系统会用到刚才提到的strstr函数了,于是就暂停下来,因为之前下了一个断点(黄色的地方)。

5. 我们观察一下寄存器部分,比如ECX寄存器所指向的内存单元里有一大堆的A,说明已经收到了数据正准备处理呢。

6.继续执行下去,终于提示出错了,说内存地址4141414141不可读,嘿嘿,cpu把我们发送的数据AAAAA…….当成指令来执行了。

发挥下想象力,如果那个内存区域不是一大堆的41,而是我们精心准备好的指令呢?

7.下面是我们的攻击代码,其作用是向目标主机发送我们精心准备的数据,也就是shellcode变量部分,介时目标主机将执行这部分指令。

上面是一段python代码,变量shellcode的内容是一段x86指令集的机器码,这些机器码的作用是弹出一个对话框。

然后执行刚才的该pythone脚本,可以看到执行成功的提示了,这时我们回到虚拟机看看GoodFtp怎样了

注意箭头所指,溢出攻击成功!目标系统成功执行我们发送的指令了。

小结:
现在的操作系统一般都会有相应的措施来对搞缓冲区溢出漏洞。比如栈随机化、栈检测等。此外,合理地给各种应用分配权限也是一种办法。

版权声明:本文为极光社区博主「xdx54321 」的原创文章,遵循 CC 4.0 BY-SA 版权协议。

原文链接:缓冲区溢出原理-极光社区


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK