我听过这个理论。地址空间位置随机化可获取库并将其加载到虚拟地址空间中的随机位置,以便万一黑客在您的程序中发现漏洞时,他没有已知的地址来执行返回libc的攻击反对。但是考虑了几秒钟之后,这作为防御措施没有任何意义。

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

这意味着,黑客无需将攻击代码指向TargetLib的已知位置,而是将其攻击代码指向应用程序的查找表中针对TargetLib的条目,然后将指针取消引用到目标例程,这样攻击就不会受到阻碍。

我不了解ASLR的工作方式吗?因为如上所述,我看不到它只是减速带,它提供了安全性的图像,但没有实际含义。我想念什么吗?

最佳答案

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

它提高了进行有效攻击的标准,因为它使简单的缓冲区溢出(可以在其中设置堆栈的返回地址)变成一个溢出,其中溢出必须包含确定正确位置的代码,然后跳转到该位置。大概这会使它变得更难。

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

07-24 09:35