我听说过这个理论。地址空间位置随机化需要库并将它们加载到虚拟地址空间中的随机位置,以便在黑客在程序中找到漏洞的情况下,他没有预先知道的地址来执行返回到libc的攻击例如,反对。但是在考虑了几秒之后,它作为一种防御措施没有任何意义。
假设我们假设的TargetLib(libc或黑客正在寻找的任何其他东西)被加载到随机地址而不是确定性地址。现在,黑客提前并不知道TargetLib及其中的例程,但是应用程序代码也没有。它需要在二进制文件中的某处具有某种查找表,以便找到TargetLib内部的例程,并且必须位于确定性位置。 (或者在随机位置,由其他东西指向。您可以根据需要添加任意数量的间接,但最终您必须从已知位置开始。)
这意味着不是将攻击代码指向TargetLib的已知位置,而是黑客需要做的就是将攻击代码指向应用程序的查找表的TargetLib条目,并取消引用指向目标例程的指针,然后攻击收益不受阻碍。
有什么关于ASLR的工作方式,我不明白吗?因为如上所述,我不知道它是什么,只不过是一个减速带,提供安全的图像,但没有实际的实质。我错过了什么吗?
答案 0 :(得分:2)
我认为这是有效的,因为它会更改共享库的基址。回想一下,共享库中的导入函数在加载时会被修补到可执行映像中,因此本身没有表,只有指向数据的特定地址和遍布程序代码的代码。
它提高了有效攻击的标准,因为它使一个简单的缓冲区溢出(可以设置堆栈上的返回地址)到溢出必须包含代码以确定正确位置然后jmp到它的那个。据推测,这只会让事情变得更难。
Windows中几乎所有的DLL都是针对他们可能无法运行的基本地址进行编译的,无论如何都会被移动,但是核心的Windows往往会优化其基址,以便不需要重定位。
答案 1 :(得分:1)
我不知道你是否正确地提出了问题,但我会解释ASLR何时生效以及何时生效。
假设我们有app.exe和TargetLib.dll。 app.exe正在使用(链接到)TargetLib.dll。 为了简化说明,我们假设虚拟地址空间只有这两个模块。
如果两者都启用了ALSR,则app.exe的基地址未知。它可以在加载时解析某些函数调用地址,但攻击者既不知道函数的位置,也不知道解析变量的位置。加载TargetLib.dll时会发生同样的事情。 即使app.exe有查找表,攻击者也不知道表的位置。
由于攻击者无法分辨具体地址的内容,因此他必须在不使用任何固定地址信息的情况下攻击应用程序。如果他使用像堆栈溢出,堆溢出,免费使用等通常的攻击方法,通常会更难......
另一方面,如果app.exe未启用ASLR,则攻击者可以更轻松地利用该应用程序。因为app.exe中的特定地址可能存在对有趣API的函数调用,并且攻击者可以使用该地址作为目标地址进行跳转。 (攻击应用程序通常从跳转到任意地址开始。)。
<强>补充:强>
你可能已经理解了,但我想澄清一点。
当攻击者通过内存损坏等漏洞利用应用程序时,他通常被迫使用fixed address jump instruction
。他们不能使用relative address jump
指令来利用。这就是为什么ALSR对这种攻击非常有效的原因。