如果我是正确的,由于 ASLR,我们将 libc 加载到某个随机地址中。然后为了在不允许内存中文本页面的写权限的情况下实现这一点,我们使用 plt/got。现在我可以简单地跳回到一些在程序执行之前众所周知的 libc@plt 函数,并且几乎可以绕过它。那么return-to-plt 会让整个概念变得毫无用处吗?
ASLR在防止linux中的return-to-libc之类的攻击方面没有用吗?
信息安全
linux
aslr
glibc
2021-08-16 03:59:03
2个回答
返回 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 地址不是随机的,这使得攻击变得容易。