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

回复 星标
更多

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

(点击上方公众号,可快速关注)

来源:伯乐在线 - zaishaoyi

网址:http://blog.jobbole.com/90589/

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

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

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

481209

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

481209

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

481209

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

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

481209

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

481209

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

481209

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

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

481209

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

481209

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

481209

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

481209

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

481209

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

481209

在EIP之后,是这样改写ESP的:

481209

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

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

481209

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

481209

现在,我们拷贝这个地址:

481209

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

481209

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

481209

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

481209

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

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

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

481209

最后运行利用代码:

481209

我们的利用代码编写完成。

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

在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线博客团队正试图以我们微薄的力量,把优秀的原创/译文分享给读者,为“快餐”添加一些“营养”元素。

微信号:jobbole

481209

(长按上图,弹出「识别二维码」后可快速关注)

--------------------------------------

商务合作QQ:2302462408

投稿网址:top.jobbole.com

此帖已被锁定,无法回复
新窗口打开 关闭