我不太清楚ASLR和PIE之间的区别。
据我所知,ASLR是一个OS选项,而PIE是一个编译选项。
那么,-如果我在启用了ASLR的操作系统上运行无饼程序会发生什么?-如果我在禁用ASLR的操作系统上运行PIE程序会发生什么?
PIE和ASLR在相同的事情上工作吗(函数、地址、库?)
谢谢
发布于 2019-02-18 13:56:15
ASLR实际上是操作系统采用的一种策略,主要是为了避免某些攻击,比如缓冲区溢出,有时是为了更好地在全局上使用整个内存。主要目标是使不同资源的位置不可预测。
然而,派或PIC与CPU指令集有很大关系,当您编写程序集代码时,这个问题尤其重要。简而言之,CPU所做的基本上是在某些地址读取数据,进行简单的算术和逻辑操作,在其他地址写入数据,并在代码中跳转。
由于许多原因,编写固定位置代码要比编写独立的代码容易得多,但这在很大程度上取决于您正在编译的CPU,特别是在微控制器中。
例如,如果您需要从内存中读取很长的数据范围,您将加载一个基本寄存器,该寄存器指向该范围的开始,然后对其进行索引。但是这个范围的地址将在编译时确定,因此是固定的。在下面的示例中,值"1005“将加载到EAX中。
USE32
ORG 1000h
00001000 B8 05 10 00 00 MOV EAX,data
00001005 48 65 6C 6C 6F data: DB "Hello"这是非常好的工作,但防止移动代码在另一个位置,而不是为之编译。如果需要这样做,则必须编写一些代码,首先将EIP的当前值加载到EAX中,然后添加当前位置和目标数据之间的差异。
它使手工开发过程稍微复杂化,但它也增加了大量的开销,使程序变得更大、更慢,这在小型微处理器上很快就会成为一个问题。
然而,在x86体系结构和其他现代计算机上,它并不是真正可见的,因为指令集已经被优化为尽可能独立于位置,而且我们有MMU的好处,它使计算机能够在同一个虚拟地址上运行每个进程。
甚至在那之前,即使是在真实模式下,我们也有段寄存器。这使得程序员能够以16字节的粒度将东西移动到任何他们想要的地方。
但是,在编译共享库时,它变得非常重要,因为所有这些库都应该在同一个寻址空间中可见(并且实际上应该是程序的一部分)。
那么,如果我在启用了ASLR的操作系统上运行一个非饼程序会发生什么呢?
实际上,这不应该是一个问题,因为这是一个随机布局重新分配资源的问题,由操作系统本身。因此,要么您已经从它得到一个指针,而且从您的角度来看没有任何变化,要么是系统已经能够正确地设置正确的寄存器,例如在运行进程之前设置堆栈时。
https://stackoverflow.com/questions/54747917
复制相似问题