6

我听说过这个理论。地址空间位置随机化获取库并将它们加载到虚拟地址空间中的随机位置,这样如果黑客在您的程序中发现漏洞,他就没有预先知道的地址来执行返回 libc 攻击反对,例如。但想了几秒,作为防御手段,也没什么意义。

假设我们假设的 TargetLib(libc 或黑客正在寻找的其他任何东西)加载到一个随机地址而不是确定性地址。现在黑客并不提前知道 TargetLib 和其中的例程在哪里,但应用程序代码也不知道。它需要在二进制文件的某个地方有某种查找表,以便在 TargetLib 中找到例程,并且必须位于确定的位置。(或者在一个随机的位置,由其他东西指向。你可以添加任意数量的间接,但最终你必须从一个已知的位置开始。)

这意味着黑客不需要将攻击代码指向 TargetLib 的已知位置,只需将攻击代码指向应用程序查找表中 TargetLib 的条目,并取消引用指向目标例程的指针,攻击就会畅通无阻。

ASLR 的工作方式有什么我不明白的地方吗?因为如上所述,我看不出它只不过是一个减速带,提供了安全的形象,但没有实际的实质。我错过了什么吗?

4

2 回答 2

2

我相信这是有效的,因为它改变了共享库的基地址。回想一下,从共享库中导入的函数在加载时会被修补到可执行映像中,因此本身没有表,只有指向数据的特定地址和分散在程序代码中的代码。

它提高了有效攻击的门槛,因为它使简单的缓冲区溢出(可以设置堆栈上的返回地址)变为溢出必须包含代码以确定正确位置然后跳转到它的位置。大概这只会让事情变得更难。

实际上,Windows 中的所有 DLL 都针对它们可能不会运行的基地址进行编译,并且无论如何都会被移动,但核心 Windows 的基地址往往会优化它们的基地址,因此不需要重定位。

于 2010-10-03T21:42:14.850 回答
1

我不知道你的问题是否正确,但我会解释 ASLR 何时有效,何时无效。

假设我们有 app.exe 和 TargetLib.dll。app.exe 正在使用(链接到)TargetLib.dll。为了解释简单,我们假设虚拟地址空间只有这两个模块。

如果两者都启用了 ALSR,则 app.exe 的基地址未知。它可能会在加载时解析一些函数调用地址,但攻击者既不知道函数在哪里,也不知道解析的变量在哪里。加载 TargetLib.dll 时也会发生同样的情况。即使 app.exe 有一个查找表,攻击者也不知道该表在哪里。

由于攻击者无法分辨特定地址的内容是什么,他必须在不使用任何固定地址信息的情况下攻击应用程序。如果他使用通常的攻击方法,如堆栈溢出、堆溢出、use-after-free...,通常会更难。

另一方面,如果 app.exe 未启用 ASLR,则攻击者更容易利用该应用程序。因为app.exe中的特定地址可能存在对有趣API的函数调用,攻击者可以将该地址作为目标地址进行跳转。(攻击应用程序通常从跳转到任意地址开始。)。

补充: 你可能已经明白了,但我想澄清一件事。当攻击者通过内存损坏等漏洞利用应用程序时,他通常被迫使用fixed address jump instruction. 他们不能使用relative address jump指令来利用。这就是为什么 ALSR 对此类攻击非常有效的原因。

于 2014-07-23T08:41:07.173 回答