首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASLR与PIE的区别

ASLR与PIE的区别
EN

Stack Overflow用户
提问于 2019-02-18 12:59:57
回答 1查看 3.5K关注 0票数 6

我不太清楚ASLR和PIE之间的区别。

据我所知,ASLR是一个OS选项,而PIE是一个编译选项。

那么,-如果我在启用了ASLR的操作系统上运行无饼程序会发生什么?-如果我在禁用ASLR的操作系统上运行PIE程序会发生什么?

PIE和ASLR在相同的事情上工作吗(函数、地址、库?)

谢谢

EN

回答 1

Stack Overflow用户

发布于 2019-02-18 13:56:15

ASLR实际上是操作系统采用的一种策略,主要是为了避免某些攻击,比如缓冲区溢出,有时是为了更好地在全局上使用整个内存。主要目标是使不同资源的位置不可预测。

然而,或PIC与CPU指令集有很大关系,当您编写程序集代码时,这个问题尤其重要。简而言之,CPU所做的基本上是在某些地址读取数据,进行简单的算术和逻辑操作,在其他地址写入数据,并在代码中跳转。

由于许多原因,编写固定位置代码要比编写独立的代码容易得多,但这在很大程度上取决于您正在编译的CPU,特别是在微控制器中。

例如,如果您需要从内存中读取很长的数据范围,您将加载一个基本寄存器,该寄存器指向该范围的开始,然后对其进行索引。但是这个范围的地址将在编译时确定,因此是固定的。在下面的示例中,值"1005“将加载到EAX中。

代码语言:javascript
复制
                                        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的操作系统上运行一个非饼程序会发生什么呢?

实际上,这不应该是一个问题,因为这是一个随机布局重新分配资源的问题,由操作系统本身。因此,要么您已经从它得到一个指针,而且从您的角度来看没有任何变化,要么是系统已经能够正确地设置正确的寄存器,例如在运行进程之前设置堆栈时。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54747917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档