有关ASLR的2个问题

我一直在阅读关于ASLR的问题,并且有几个问题。 我没有什么编程经验,但我对它背后的理论很感兴趣。

我知道它会随机化DLL,堆栈和堆在虚拟地址空间中的位置,以便恶意代码不知道它们的位置,但实际程序在需要它们时如何知道它们的位置?

如果合法进程能够找到它们,什么能阻止恶意代码执行相同的操作?

最后是ASLR试图阻止其正在攻击的进程的用户空间中运行的恶意代码?

谢谢


作为背景,ASLR旨在使代码注入攻击复杂化,攻击者试图利用您的溢出漏洞欺骗您的应用程序运行攻击者的代码。 例如,在成功的堆栈缓冲区溢出攻击中,攻击者将其代码压入堆栈,并修改调用帧的返回指针以指向栈上代码。

大多数代码注入攻击要求攻击者知道进程内存布局某些部分的绝对地址。 对于堆栈缓冲区溢出攻击,他们需要知道有漏洞的函数调用的堆栈帧的地址,以便他们可以将函数返回指针设置为指向堆栈。 对于其他攻击,这可能是堆变量,异常表等的地址。

一个更重要的背景事实:与编程语言不同,机器代码具有绝对地址。 当您的程序可能调用函数foo() ,机器代码将调用地址0x12345678

但实际计划在需要时如何知道他们的位置?

这是通过动态链接器和其他操作系统功能建立的,这些功能负责将您的磁盘可执行文件转换为内存中进程。 这涉及用引用0x12345678替换对foo的引用。

如果合法进程能够找到它们,什么能阻止恶意代码执行相同的操作?

合法的进程知道地址的位置,因为动态链接器创建进程,使得实际地址被硬连接到进程中。 所以这个过程本身并没有定位它们。 过程开始时,地址全部计算并插入代码中。 攻击者不能利用它,因为他们的代码没有被动态链接器修改。

考虑一下攻击者拥有他们试图攻击的可执行文件副本的情况。 他们可以在他们的机器上运行可执行文件,检查它并找到所有相关的地址。 如果没有ASLR,那么当您运行可执行文件时,这些地址在您的机器上具有相同的机会。 ASLR将这些地址随机化,这意味着攻击者无法(轻松地)找到地址。

最后是ASLR试图阻止其正在攻击的进程的用户空间中运行的恶意代码?

除非存在内核注入漏洞(这可能会非常糟糕,并会导致操作系统出现补丁),是的,它在用户空间中运行。 更具体地说,它可能位于堆栈或堆上,因为这是存储用户输入的地方。 使用数据执行防护还将有助于防止成功的注入攻击。

链接地址: http://www.djcxy.com/p/62201.html

上一篇: 2 questions regarding ASLR

下一篇: Why aren't glibc's function addresses randomized when ASLR is enabled?