ASLR在防止linux中的return-to-libc之类的攻击方面没有用吗?

信息安全 linux aslr glibc
2021-08-16 03:59:03

如果我是正确的,由于 ASLR,我们将 libc 加载到某个随机地址中。然后为了在不允许内存中文本页面的写权限的情况下实现这一点,我们使用 plt/got。现在我可以简单地跳回到一些在程序执行之前众所周知的 libc@plt 函数,并且几乎可以绕过它。那么return-to-plt 会让整个概念变得毫无用处吗?

2个回答

是的,如果 PIE 被禁用。人们常说,对于没有使用 PIE(位置无关代码)支持编译的应用程序,ASLR 的有效性会大大降低。当不使用 PIE 时,程序必须依赖在链接期间创建的固定 PLT 来解析共享库中函数的地址。当使用 ASLR 并启用 PIE 时,代码重用攻击通常会得到缓解,尽管信息泄漏仍然如此普遍,以至于 ASLR 通常可以通过侧信道攻击被击败,使其对本地恶意代码几乎无用,并将其有效性限制为网络攻击和无脚本攻击. 没有 PIE 的 ASLR 较弱以及使用较少随机化的原因还有其他几个原因,如另一个答案中所述。

返回 plt 和返回 libc 是略有不同的攻击。

返回 libc

防止缓冲区溢出的方法之一是使用非可执行堆栈。为了制作不可执行的堆栈,从 CPU 和系统级别,他们使用称为 NX 位的东西。如果设置了 NX 位,则该内存地址是不可执行的。即使我们执行缓冲区溢出并重写堆栈以将返回指针重定向到我们的 shell 代码所在的堆栈,shell 代码也不会运行,因为它会在堆栈中 - 这是一个不可执行的内存部分。

这是我们使用 return to libc 攻击来生成 shell 的时候。我们没有使用经典的方法将返回地址覆盖为 shell 代码的地址,而是使用 libc system() 调用的地址。

返回到 PLT

ASLR 或地址空间布局随机化是控制缓冲区溢出的另一种方法。就像我在上一节中所说,人们通过查找由 system.like libc 加载到内存中的可执行文件来绕过 NX。这是可能的,因为很容易识别系统加载的可执行文件的位置。ASLR 随机化了这些可执行文件的地址,从而通过重定向到它们来降低生成 shell 的可能性。

这种攻击可能的原因是在具有动态链接库的可执行文件中,可以从 PLT 和 GOT 获得 libc 函数地址。PLT 地址不是随机的,这使得攻击变得容易。