代码之家  ›  专栏  ›  技术社区  ›  Mason Wheeler

ASLR如何有效?

  •  6
  • Mason Wheeler  · 技术社区  · 14 年前

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

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

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

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

    2 回复  |  直到 10 年前
        1
  •  2
  •   Jacob O'Reilly    14 年前

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

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

    实际上,Windows中的所有DLL都是为基本地址编译的,这些基本地址可能不会运行,也将被移动,但核心Windows的DLL往往会对其基本地址进行优化,因此不需要重新定位。

        2
  •  1
  •   Shu Suzuki    10 年前

    我不知道你的问题是否正确,但我会解释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对这种剥削确实有效的原因。