2011-09-05 43 views
10

我想了解这两种攻击类型之间的确切区别。从我已阅读:- 缓冲区溢出和返回到libc攻击之间的区别

缓冲区溢出:它覆盖栈上的RET地址为指向恶意代码插入代码的另一部分。非常有效 - 在这里我们需要修改程序的源代码以实际执行攻击。

返回Libc-这里不是修改源代码,由C库提供运行时功能调用用来(说打开一个shell)。这里用于函数调用的参数也在覆盖缓冲区中传递,最终在堆栈的ret部分之后结束。

以上是一个准确的描述吗?

而另一个相关的问题 - 这将是可能有,而不真正修改原始程序的源代码中的缓冲区溢出攻击?如果我们编写一个新程序并允许修改某些内存段(这是原始程序损坏的堆栈中新的ret地址),那可能就是这种情况。再次,我认为这可能是不可能的,因为内核中的进程之间提供了内存保护。

回答

12

在经典的缓冲器溢出攻击,要执行被溢出填充有两者的机器代码的堆栈缓冲器(称为壳码,因为它典型地调用一个外壳进程)和新的返回地址。新的返回地址将被制作成指向溢出堆栈缓冲区本身。显然,这需要知道或猜测攻击过程中堆栈缓冲区的地址。

在那些日子里,进程的内存布局通常是非常确定性的 - 通常攻击者可以很好地预测堆栈缓冲区的位置(特别是如果他们知道目标软件的哪个版本正在被攻击)。为了在涉及一些猜测时提高成功几率,活动shellcode往往会有大量可执行的机器代码,它们不会执行任何有用的操作 - 称为“NOP sled”或“NOP slide”,其中“NOP”是执行“无操作”的机器代码指令的典型名称。回到NOP底座的任何一点都会产生预期的效果。

“回归到libc的”漏洞,而另一方面,不会引起被劫持的过程中直接返回的shellcode。相反,它会使进程逐一返回到一​​系列库函数的开始。这些库函数可能直接执行攻击者想要的操作,但更常见的是它们将用于间接执行攻击者的shellcode。

0

嗯,事实上,在一个缓冲区溢出攻击,可以插入恶意代码,而重写RET指针。您无需为此修改任何内容,因此作为结论,我无法看到两种攻击之间的区别。

例如:

char* str[5];
cin << str;

这是可以exploided,如果用户将一个字符串大于5个字符,一切下面将被覆盖在堆栈上的代码。由于ret-ptr在堆栈中“较低”的事实,如果距离正确,则可以覆盖它。重写时你的意图是让它指向输入的开始,在其中插入恶意(汇编程序)代码,只要调用ret-ptr并执行“跳转”就会执行代码。

4

重写保留地址的该部分的攻击两者之间共享。正如上面的答复所表明的那样,您以前只是简单地返回到您编写的汇编代码中。然后这个汇编代码就会产生一个root用户shell。

在这两次攻击中,你都不会'覆盖'源代码。从程序集的角度来看,源代码位于.text段,并且一直(或至少在我知道的时候)受写保护。你曾经使用过的东西是编写你已经组装到内存段中的代码,然后跳转到这段代码。代码最通常位于“堆栈段”中或附近,并且通过溢出所选择的任何内容,您将重定向来自ret地址(例如)的流量。其他攻击场所包括一个你事先创建并填充你的shellcode的环境变量;或者也是堆,函数指针或PLT。这样插入的代码通常会使用system()调用来执行所期望的操作 - 但是为此,您需要能够在内存区域执行(或者将您打算使用的重定位条目声明为可写)。

的两次攻击之间的区别在于,一旦内存已经取得了很大程度上的非可执行文件,攻击类型(堆栈溢出)是非常拧。当你写作时,试图绕过这种类型的攻击直接访问共享库函数 - 也就是说,你不再需要将代码先写入堆栈段或其他地方,然后在那里执行。不过,我认为libc类型的攻击现在也已基本修补;我没有这方面的细节。也许我错了。

如果您想了解这些攻击如何受到阻碍,或者至少阅读了一些关键想法,谷歌“2011年粉碎堆栈”(或2010年)开始。

+0

你能解释一下你的意思 - 让存储可执行文件(或不可执行)。另一个疑问(我原来的问题的一部分)是 - 我相信C代码将无法访问主内存的所有部分。那么如何确定恶意汇编代码在内存中的位置呢?因为我认为对于大多数记忆区域 - 在返回时只会标记分段错误。 – Hari

+0

您插入的漏洞利用代码的核心通常是使用和exec()系列风格的函数。这意味着,通过给它提供适当的参数,你可以让它产生一个/ bin/sh shell作为root用户。这是*正在执行*一个程序,你不能再做了。有许多不同的安全措施,但这种人会被描述,例如,在 – gnometorule

+0

http://en.wikipedia.org/wiki/NX_bit – gnometorule

4

我想说缓冲区溢出是一类编程错误和返回到libc是一个漏洞利用技术。最好不要将这些概念混合在一起。

例如,你可以使用返回到libc利用一个缓冲区溢出漏洞。或者你也可以使用其他技术,如回报与.text区段,或回的shellcode。反之,你也可以使用返回到libc利用其他错误,如格式字符串了。