虚拟机安装:Ubuntu 12.04(x86)
这个帖子是最简单的漏洞开发教程系列,在互联网上你可以找到很多关于它的文章。尽管它丰富和熟悉,我更喜欢自己写博客文章,因为它将作为我未来许多职位的先决条件!
什么是缓冲区溢出?
将源缓冲区复制到目标缓冲区可能导致溢出
1、源字符串长度大于目标字符串长度。
2、不进行大小检查。
缓冲区溢出有两种类型:
1、基于堆栈的缓冲区溢出 - 这里的目标缓冲区位于堆栈中
2、基于堆的缓冲区溢出 - 这里的目标缓冲区位于堆中
在这篇文章中,我将只讨论基于堆栈的缓冲区溢出。堆溢出将在Linux(x86)漏洞开发教程系列的 “3级”中讨论!
缓冲区溢出错误导致任意代码执行!
什么是任意代码执行?
任意代码执行允许攻击者执行他的代码以获得对受害机器的控制。受害机器的控制是通过多种方式实现的,例如产生根shell,添加新用户,打开网口等...
听起来很有趣,足够的定义让我们看看缓冲区溢出攻击的代码!
漏洞代码
编译代码
上述漏洞代码的[2]行显示了缓冲区溢出错误。这个bug可能导致任意代码执行,因为源缓冲区内容是用户输入的!
如何执行任意代码执行?
使用称为“ 返回地址覆盖 ”的技术实现任意代码执行。这种技术有助于攻击者覆盖位于堆栈中的“返回地址”,并且这种覆盖将导致任意代码执行。
在研究漏洞代码之前,为了更好的理解,让我们反汇编并且绘制出漏洞代码的堆栈布局。
反汇编
堆栈布局:
因为我们已经知道用户输入的大于256,将溢出目标缓冲区并覆盖堆栈中存储的返回地址。通过发送一系列“A”来测试它。
测试步骤1:是否可以覆盖返回地址?
以上输出显示指令指针寄存器(EIP)被“AAAA”覆盖,这样可以确定覆盖返回地址是可能的!
测试步骤2:目的缓冲区的偏移量是多少?
这里让我们找出返回地址相对与目的缓冲区'buf'的偏移量。在反汇编并绘制了main()的堆栈布局后,现在可以尝试找到偏移位置信息! 堆栈布局显示返回地址位于距目标缓冲区“buf”的偏移(0x10c)处。 0x10c计算如下:
哪里
因此,用户输入的 “A” * 268 + “B” * 4,覆盖了’buf‘,对齐空间和调用者的ebp覆盖为”A"并且返回地址变为"BBBB"
以上输出显示攻击者可以控制返回地址。 位于堆栈位置(0xbffff1fc)的返回地址被“BBBB”覆盖。 有了这些信息,我们可以编写一个漏洞利用程序来实现任意的代码执行。
攻击代码:
执行上面的exploit程序,给了我们root shell,如下所示:
注意:为了获得这个root shell,我们关闭了许多漏洞利用缓解技术。 对于所有文章中的1级,我已经禁用了这些利用减轻技术,因为第1级的目标是向您介绍漏洞。 当我们进入Linux(x86)利用开发教程系列的“2级”时,真正的乐趣会发生在这里,我将在此讨论绕过这些利用减轻技术!
责任编辑:韩希宇
免责声明:
中国电子银行网发布的专栏、投稿以及征文相关文章,其文字、图片、视频均来源于作者投稿或转载自相关作品方;如涉及未经许可使用作品的问题,请您优先联系我们(联系邮箱:cebnet@cfca.com.cn,电话:400-880-9888),我们会第一时间核实,谢谢配合。