Security ASLR如何有效?

Security ASLR如何有效?,security,aslr,Security,Aslr,我听过这个理论。地址空间位置随机化将库加载到虚拟地址空间中的随机化位置,以便在黑客发现程序漏洞的情况下,例如,他没有预先知道的地址来执行返回libc攻击。但是在考虑了几秒钟之后,作为一种防御措施,它没有任何意义 假设我们假设的TargetLib(libc或黑客正在寻找的任何其他东西)是在随机地址而不是确定性地址加载的。现在,黑客事先不知道TargetLib及其内部例程在哪里,但应用程序代码也不知道。为了找到TargetLib内部的例程,它需要在二进制文件中的某个地方有某种查找表,而这必须在一个确

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

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

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


ASLR的工作方式有什么我不明白的地方吗?因为如前所述,我不认为这是一个减速带,提供了安全的形象,但没有实际的实质内容。我遗漏了什么吗?

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

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


实际上,Windows中的所有DLL都是针对一个基址进行编译的,它们可能不会运行,而且无论如何都会被移动,但核心Windows DLL往往会对其基址进行优化,以便不需要重新定位。

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

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

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

由于攻击者无法辨别特定地址的内容,因此必须在不使用任何固定地址信息的情况下攻击应用程序。如果他使用常用的攻击方法,如堆栈溢出、堆溢出、释放后使用,通常会更加困难

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

补充: 你可能已经明白了,但我想澄清一件事。
当攻击者通过内存损坏等漏洞攻击应用程序时,通常会被迫使用
固定地址跳转指令
。他们不能使用
相对地址跳转
指令进行攻击。这就是为什么ALSR对此类攻击非常有效的原因。

您曾经在ASM级别调试过Windows EXE吗?里面有一张真正的进口表。加载程序不会修补代码(代码可能调用某些外部例程的所有位置),而是修补导入表,导入表基本上是一个很长的JMP指令序列,编译器会生成对它的调用。@Mason Wheeler-时间不长,但很高兴知道这一点。虽然这使得确定一个特定的地址变得更容易,但净效果是一样的,不是吗?它将一个已知变为未知,这只会使攻击更加困难。好的。这是我不太明白的最后一点。为什么攻击者可以使用
固定地址跳转
(这是一个ASM操作码),但不能使用
相对地址跳转
(这只是另一个ASM操作码)?有什么神奇的区别我不知道吗?好吧,为了解释它,你首先要了解这种利用是如何运作的。一个很好的例子是典型的缓冲区溢出和返回地址覆盖。这里我不解释细节,但重点是攻击者所做的是用某个固定值覆盖
返回地址。当执行流从易受攻击的函数退出时,它跳转到被覆盖的地址。此跳转总是
固定地址跳转
而不是
相对跳转
。可能存在一些漏洞,您可以使用
相对跳转
进行攻击,但这种情况很少见。换句话说,攻击者只能破坏
数据
而不是
指令
。为了利用应用程序进行攻击,他们破坏了“固定地址跳转”指令使用的“数据”。攻击者所做的是提取外壳代码(他们想要执行的代码)并跳转到外壳代码。在外壳代码中,它们可以使用相对跳转,但在ASLR环境下,跳转到外壳代码本身是一个困难的问题。