ASLR和PIE的区别和作用

在这里插入图片描述

ASLR的作用

首先ASLR是归属于系统功能的, aslr是一种针对缓冲区溢出安全保护技术,通过对、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术。如今LinuxFreeBSDWindows等主流操作系统都已采用了该技术。

在传统的操作系统里,用户程序的地址空间布局是固定的,自低向高依次为代码区, BSS区,堆栈区,攻击者通过分析能轻易得出各区域的基地址,在此情况下,只要攻击者的 注入代码被执行,攻击者就能随意跳转到想到达的区域,终取得计算机的控制权,试想如 果一个程序在执行时,系统分配给此进程三个区域的基地址是随机产生的,每次该程序执行 都不一样,那么攻击者注入的代码即使被执行,也终会因为无法找到合法的返回地址而产 生错误,终进程停止,攻击者无法入侵,这就是地址空间布局随机化的基本思想。

在ASLR的实现中,系统将进程的 用户空间分为三个区域,可执行区,映射区和栈区,可执行区存放可执行代码,初始化数据 和未初始化数据,映射区包括堆,动态库和共享内存,栈区是用户态栈,当进程被创建时, 对于X86体系计算机,系统给每个区域一个随机的偏移量,分别为16位,16位和24位,其中 映射区偏移量称为delta-map,这样动态链接库的基地址就有65536种可能 ,当然这个数字应 该更大一些的,因为对于现代计算机而言,这实在不算一个很大的范围,但是对于32位的线 性地址来说,高四位为全局页表,如果用随机产生会影响对高位内存的映射能力,会产生大 量的内存碎片,低12位要考虑页对齐,因而只能有16位来作为偏移量,而在64位机上,则可 以有40位来产生delta-map,效率将大大提高 。

PIE的作用

ASLR 不负责代码段以及数据段的随机化工作,这项工作由 PIE 负责。

由于ASLR是一种操作系统层面的技术,而二进制程序本身是不支持随机化加载的,便出现了一些绕过方式,例如ret2plt,GOT劫持,地址爆破等。于是,人们于2003年引入了位置无关可执行文件(Position - Independent Executable,PIE),他在应用层的编译器上实现,通过将程序编译为位置无关代码(Position - Independent Code,PIC),使程序可以被加载到任意位置,就像是一个特殊的共享库。在PIE和ASLR同时开启的情况下,攻击者将对程序的内存布局一无所知,大大增加了利用难度。当然,凡事有利也有弊,在增加安全性的同时,PIE也会一定程度上影响性能,因此绝大多数操作系统上PIE仅用于对一些安全性要求较高的程序。

Logo

更多推荐