我不太确定要了解ASLR和PIE之间的区别。
根据我的说法,ASLR是OS选项,而PIE是编译选项。
所以, -如果我在启用ASLR的操作系统上运行无PIE程序会怎样? -如果我在禁用ASLR的操作系统上运行PIE程序会怎样?
PIE和ASLR是否在相同的东西上工作(函数地址,库?)
谢谢
答案 0 :(得分:1)
ASLR实际上是OS故意采用的一种策略,主要是为了规避某些诸如缓冲区溢出之类的攻击,有时还可以更好地全局使用整个内存。主要目标是使不同资源的位置无法预测。
但是,PIE或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的优势,因此MMU可以使计算机在以下位置运行每个进程相同的虚拟地址。
甚至在此之前,即使在实模式下,我们也有段寄存器。这使程序员能够以16字节的粒度将事物基本上转移到他们想要的任何地方。
但是,在编译共享库时变得至关重要,因为所有共享库都应该在同一进程寻址空间中可见(并且实际上应该是程序的一部分)。
那么-如果我在启用了ASLR的操作系统上运行no-PIE程序会怎样?
实际上,这应该不成问题,因为这是由操作系统本身随机分配资源的问题。因此,要么您已经从中获得了一个指针,但从您的角度来看并没有任何改变,要么取决于系统来正确设置正确的寄存器,例如在运行进程之前设置堆栈时。