缓冲区溢出攻击:它们是如何进行的?

日期: 2009-08-17 作者:Brien M. Posey翻译:Sean 来源:TechTarget中国 英文

缓冲区溢出是黑客们喜欢利用的手段之一。绝大多数微软提供的补丁修复程序并未检查缓冲区问题,而应用程序的内部开发是怎样的呢?它们和商业应用软件一样,对缓冲区溢出攻击敏感。因此,在使用本地应用程序之前,知道应用软件如何工作和怎样进行漏洞测试是很重要的。   缓冲区溢出攻击利用了程序等待用户输入的缺点。

目前,主要有两种类型的缓冲区溢出攻击:基于堆栈和基于堆。基于堆的攻击是对程序预留内存空间进行溢出,但由于难以加入可执行的指令,这种攻击现在很罕见。目前最常见的是基于堆栈的缓冲区溢出攻击。   在基于堆栈的缓冲区溢出攻击中,被攻击者利用的程序使用一个名叫堆栈的内存对象来存储用户的输入。

通常情况下,在程序没……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

缓冲区溢出是黑客们喜欢利用的手段之一。绝大多数微软提供的补丁修复程序并未检查缓冲区问题,而应用程序的内部开发是怎样的呢?它们和商业应用软件一样,对缓冲区溢出攻击敏感。因此,在使用本地应用程序之前,知道应用软件如何工作和怎样进行漏洞测试是很重要的。

  缓冲区溢出攻击利用了程序等待用户输入的缺点。目前,主要有两种类型的缓冲区溢出攻击:基于堆栈和基于堆。基于堆的攻击是对程序预留内存空间进行溢出,但由于难以加入可执行的指令,这种攻击现在很罕见。目前最常见的是基于堆栈的缓冲区溢出攻击。

  在基于堆栈的缓冲区溢出攻击中,被攻击者利用的程序使用一个名叫堆栈的内存对象来存储用户的输入。通常情况下,在程序没有用户输入以前,堆栈是空的。有用户输入时,程序先写入一个返回内存的地址到堆栈,然后把用户的输入数据存储在返回地址的上方。当执行堆栈时,用户的输入数据就被传送到程序指定的返回地址中。

  然而,堆栈的大小都是有限的。开发代码的程序员必须给堆栈保留一定数量的空间。如果用户的输入超出了在堆栈里为它预留的空间大小,那么堆栈会溢出。这本来不是一个很大的问题,但如果遇到恶意输入时,它就变成了一个巨大的安全漏洞。

  例如,假设某个程序正等待用户输入他或她的姓名,黑客可能会输入长度超过堆栈大小的可执行命令,而不是输入姓名。而这条命令通常很简短。例如,在Linux环境下,典型的如EXEC(“sh”)命令,它要求系统打开一个命令提示符窗口,使用Linux的人称它为root shell.。

  然而有可执行指令的缓冲区溢出并不意味着指令就会被执行。攻击者必须为恶意指令指定一个返回地址。由于堆栈溢出,程序会部分崩溃。然后程序会试图通过指定返回地址进行恢复,但是返回地址已经被黑客改变为指向恶意指令。当然,这意味着黑客必须知道恶意指令将存储的地址。为了省去寻找精确地址的麻烦,攻击者可以通过对恶意指令的两头进行NOP指令(一种指针)填充。在不知道内存精确范围时,对堆栈两头进行填充是常见的技术。因此,如果黑客指定的地址中落在填充的范围之内,恶意命令将可能会被执行。

  最后一部分是可执行程序的权限。如你所知,大多现代化的操作系统都采用某种机制来控制当前登录用户的访问级别权限,而执行程序通常需要更高级别的权限。因此,这些程序以内核模式或以葱服务帐户继承的权限模式运行。当堆栈溢出攻击执行新的返回地址上的命令时,程序认为它仍然在运行。这意味着,命令提示符窗口同被攻击的应用程序一样具有相同的权限。通常,这意味着攻击者已经完全取得了操作系统的控制权。

作者

Brien M. Posey
Brien M. Posey

Brien M. Posey,微软认证系统工程师,Windows 2000 Server 和 IIS方面最有价值专家。Brien曾任全国性连锁医院的CIO,负责过Fort Knox的网络安全。作为一名自由撰稿人,他为微软, CNET, ZDNet, TechTarget, MSD2D, Relevant Technologies 以及其他的科技公司写过稿。

翻译

Sean
Sean

相关推荐