2个关于ASLR的问题

2 questions regarding ASLR

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

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

如果合法进程可以找到它们,如何阻止恶意代码做同样的事情?

最后,ASLR 试图阻止 运行 的恶意代码是否存在于它正在攻击的进程的用户 space 中?

谢谢

作为背景,ASLR 旨在使 code injection attacks where the attacker tries to utilize your overflow bug to trick your application into running the attacker's code. For example, in a successful stack buffer overflow attack 攻击者将他们的代码推入堆栈并修改调用帧的 return 指针以指向堆栈代码。

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

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

but how does the actual program know their location when it needs them?

这是由 dynamic linker 和其他操作系统功能建立的,这些功能负责将磁盘上的可执行文件转换为内存中的进程。这涉及将对 foo 的引用替换为对 0x12345678.

的引用

If the legitimate process can locate them, what stops the malicious code doing the same?

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

考虑这样一种情况,攻击者拥有他们试图攻击的同一可执行文件的副本。他们可以 运行 他们机器上的可执行文件,对其进行检查,并找到所有相关地址。如果没有 ASLR,当您 运行 执行可执行文件时,这些地址很有可能在您的计算机上相同。 ASLR 随机化这些地址,这意味着攻击者无法(轻松)找到地址。

and finally, is the malicious code that ASLR tries to prevent running in the user space of the process it is attacking?

除非存在内核注入漏洞(这可能非常糟糕并导致您的 OS vendpr 打补丁),是的,它在用户 space 中 运行ning。更具体地说,它可能位于堆栈或堆上,因为这是存储用户输入的地方。使用 data execution prevention 也有助于防止成功的注入攻击。