# 一个缓冲区溢出漏洞的简易教程

- URL: https://wuming.si/blog/1036/
- Author: Aaron
- Published: 2015-09-08
- Language: zh-Hans
- Categories: Uncategorized
- Originally published at: http://blog.wo.ai/archives/1036

这篇文章类似于“傻瓜系列之利用缓冲区溢出”。在这类漏洞中，我们的做法是利用网络，程序控制器，输入等等，发送超大的数据缓冲区给程序，覆盖程序内存的重要部分。在这些缓冲区覆盖程序内存之后，我们可以重定向程序的执行流并运行注入代码。

首先，我们需要做的是查明程序的哪一部分可以用来重写内存。处理这个任务的过程叫作“fuzzing”。我们可以为Metasploit框架中的各种协议找到若干个fuzzer（执行fuzzing任务的工具）。

接下来这个例子中，我们用metasploit对一个ftp服务器进行fuzz：

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/666a7f5b98_6941baebjw1evu3i4joh2j20k10bmjtk.jpg)

Fuzzer运行几分钟后，程序就崩溃了，见下图：

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/84d3cbdbb8_6941baebjw1evu3i6l6irj20av02pq33.jpg)

在Metasploit窗口中，我们可以看到崩溃缓冲区的长度：

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/73208e5b30_6941baebjw1evu3i6tjdjj20j6057aaw.jpg)

在分析所有输出内容之后，我们可以得出：在ftp服务器通过用户命令发送了一个大于250的缓冲区后，程序崩溃了。

我们可以使用python来重现崩溃：

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/885cbd502c_6941baebjw1evu3i7anqrj20hx07qwfe.jpg)

现在，我们重新实施这次攻击，但是首先要将FTP SERVER进程附加到一个调试器上，在这里我们用的调试器是OLLYDBG。

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/3278ffc48d_6941baebjw1evu3i7bc5jj20cv03fmxg.jpg)

在实施攻击之后，我们可以很直观地看到ESP,EDI和EIP寄存器被覆盖。

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/5e76745cd5_6941baebjw1evu3i7jzw8j20ip08xgn3.jpg)

稍微研究一下，大家可以发现：EIP控制程序的执行流，如果可以重写EIP，那么就可以手动重定向程序的执行流。EIP指向下一个待执行地址。

在这里，我们需要知道要重写的EIP缓冲区长度。我们可以在metasplpit中用pattern_create创建一种模式，并且作为一个缓冲区使用，来获取重写EIP的4个字节的位置。

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/5e76745cd5_6941baebjw1evu3i86fv0j20jw04jmzd.jpg)

把这些命令添加到我们的利用代码中，并再次运行：

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/8629f3d3fc_6941baebjw1evu3i8c4h3j20nc08wq4h.jpg)

现在，我们可以看到程序内存中的模式。

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/3f41808a0c_6941baebjw1evu3i8nf4cj20k208pwfw.jpg)

现在需要使用pattern_offset（偏移量模式）来找到那4个字节的准确位置（只要把4个字节作为一个脚本参数粘贴到EIP里面）。

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/38bdb96135_6941baebjw1evu3i8zlanj20kb01lq3g.jpg)

由于在EIP之后ESP就被重写，我们可以写出这样一段利用代码如下：

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/38bdb96135_6941baebjw1evu3i94s4gj20h908h75c.jpg)

并且，如果重新加载，在OLLY里面，可以看到它运行得很好。

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/ef7df4b533_6941baebjw1evu3i961tfj207z057mxq.jpg)

在EIP之后，是这样改写ESP的：

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/ef7df4b533_6941baebjw1evu3i9kgk7j207i092q4k.jpg)

那么在EIP里面我们需要做什么呢？将我们的恶意代码放到重写EIP的代码后面，然后需要做的只是简单的JMP ESP。

记住，EIP将包含下一条待执行指令的地址，所以此时需要做的是找到包含JMP ESP的地址。我们可以在OLLY(在E标签页)中进行查找。

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/b12d51d0a7_6941baebjw1evu3ia6o8xj20jk02mmye.jpg)

一个简单的命令检索将会返回给我们一个地址。

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/b12d51d0a7_6941baebjw1evu3ia4e12j20i204gjsc.jpg)

现在，我们拷贝这个地址：

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/0c9e2092d3_6941baebjw1evu3iaak0vj20dn058jsz.jpg)

最后，我们需要做的是，在实行攻击之后，加入并执行我们的shell代码。我们可以用metasploit生成这些shellcode。

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/0c9e2092d3_6941baebjw1evu3ibb22uj20qm08tdhk.jpg)

现在我们的利用代码如下。注意一下案例中CPU的ENDIAN，在EIP寄存器中我们会用到小端格式。

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/0c9e2092d3_6941baebjw1evu3ib0k5gj20hs0in7d6.jpg)

现在，如果我们再次实行攻击，将会运行我们的shellcode。

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/3c1e5e6ba4_6941baebjw1evu3i4tzxnj20c703bt91.jpg)

好的，现在我们可以生成另外的shellcode来执行不同的任务。

我们可以生成一段反向连接的shell代码，来访问我们的受害主机。

把这行代码我们的利用代码中，

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/2ef637b855_6941baebjw1evu3ibwftxj20i40e6n66.jpg)

最后运行利用代码：

![](http://blog.wo.ai/wp-content/plugins/wp-o-matic/cache/2ef637b855_6941baebjw1evu3ic5j8bj20je037wez.jpg)

[我们的利用代码编写完成](https://www.youtube.com/watch?v=Wnn47V09Q2M)。

提示：注意一些特殊字符。如果在缓冲区中间，利用代码被截断，可能是由于一些特殊字符导致的。特殊字符诸如“xa0″、 “|x00″等，会截断shellcode，你必须通过测试找到这些字符，并且在shellcode中避免用到，可别说我没提醒过你！

### 相关文章

  * [几种极其隐蔽的XSS注入的防护](http://blog.jobbole.com/26064/)
  * [我是如何在腾达路由器固件程序上发现漏洞的](http://blog.jobbole.com/52181/)
  * [浅谈CSRF攻击方式](http://blog.jobbole.com/23911/)
  * [我是如何绕过Google和Facebook等大站的两步验证的](http://blog.jobbole.com/74590/)
  * [我如何发现Facebook服务器中的远程代码执行漏洞：OpenID中的XML外部实体扩展漏洞](http://blog.jobbole.com/58179/)
  * [iOS又曝安全漏洞 可监视用户的触摸点击行为](http://blog.jobbole.com/61207/)
  * [OpenSSL 开发者否认蓄意植入 Heartbleed 漏洞](http://blog.jobbole.com/64878/)
  * [Google调整漏洞奖励计划，单个漏洞最高奖励7,500美元](http://blog.jobbole.com/29366/)
  * [我是如何在谷歌财经发现一个XSS漏洞，并且拿到了5千美元奖励](http://blog.jobbole.com/44953/)
  * [LulzSec如何黑掉《太阳报》网站的？](http://blog.jobbole.com/1119/)

[一个缓冲区溢出漏洞的简易教程](http://blog.jobbole.com/90589/)，首发于[博客 – 伯乐在线](http://blog.jobbole.com)。
