前言

我们在前文《APP漏洞扫描器之本地拒绝服务检测详解》了解到阿里聚安全漏洞扫描器有一项静态分析加动态模糊测试的方法来检测的功能,并详细的介绍了它在针对本地拒绝服务的检测方法。

同时,阿里聚漏洞扫描器有一个检测项叫未使用地址空间随机化技术, 该检测项会分析APP中包含的ELF文件判断它们是否使用了该项技术。如果APP中存在该项漏洞则会降低缓冲区溢出攻击的门槛。

本文主要介绍该项技术的原理和扫描器的检测方法。由于PIE的实现细节较复杂,本文只是介绍了大致的原理。想深入了解细节的同学可以参看潘爱民老师的书籍《程序员的自我修养》。

PIE是什么

PIE(position-independent executable)是一种生成地址无关可执行程序的技术。如果编译器在生成可执行程序的过程中使用了PIE,那么当可执行程序被加载到内存中时其加载地址存在不可预知性。

PIE还有个孪生兄弟PIC(position-independent code)。其作用和PIE相同,都是使被编译后的程序能够随机的加载到某个内存地址。区别在于PIC是在生成动态链接库时使用(Linux中的so),PIE是在生成可执行文件时使用。

PIE的作用

安全性

PIE可以提高缓冲区溢出攻击的门槛。它属于ASLR(Address space layout randomization)的一部分。ASLR要求执行程序被加载到内存时,它其中的任意部分都是随机的。包括
Stack, Heap ,Libs and mmap, Executable, Linker, VDSO。通过PIE我们能够实现Executable 内存随机化

节约内存使用空间

除了安全性,地址无关代码还有一个重要的作用是提高内存使用效率。

一个共享库可以同时被多个进程装载,如果不是地址无关代码(代码段中存在绝对地址引用),每个进程必须结合其自生的内存地址调用动态链接库。导致不得不将共享库整体拷贝到进程中。如果系统中有100个进程调用这个库,就会有100份该库的拷贝在内存中,这会照成极大的空间浪费。

相反如果被加载的共享库是地址无关代码,100个进程调用该库,则该库只需要在内存中加载一次。这是因为PIE将共享库中代码段须要变换的内容分离到数据段。使得代码段加载到内存时能做到地址无关。多个进程调用共享库时只需要在自己的进程中加载共享库的数据段,而代码段则可以共享。

PIE工作原理简介

网友评论