前言

我們在前文《APP漏洞掃描器之本地拒絕服務檢測詳解》了解到阿里聚安全漏洞掃描器有一項靜態(tài)分析加動態(tài)模糊測試的方法來檢測的功能,并詳細的介紹了它在針對本地拒絕服務的檢測方法。

同時,阿里聚漏洞掃描器有一個檢測項叫未使用地址空間隨機化技術, 該檢測項會分析APP中包含的ELF文件判斷它們是否使用了該項技術。如果APP中存在該項漏洞則會降低緩沖區(qū)溢出攻擊的門檻。

本文主要介紹該項技術的原理和掃描器的檢測方法。由于PIE的實現(xiàn)細節(jié)較復雜,本文只是介紹了大致的原理。想深入了解細節(jié)的同學可以參看潘愛民老師的書籍《程序員的自我修養(yǎng)》。

PIE是什么

PIE(position-independent executable)是一種生成地址無關可執(zhí)行程序的技術。如果編譯器在生成可執(zhí)行程序的過程中使用了PIE,那么當可執(zhí)行程序被加載到內(nèi)存中時其加載地址存在不可預知性。

PIE還有個孿生兄弟PIC(position-independent code)。其作用和PIE相同,都是使被編譯后的程序能夠隨機的加載到某個內(nèi)存地址。區(qū)別在于PIC是在生成動態(tài)鏈接庫時使用(Linux中的so),PIE是在生成可執(zhí)行文件時使用。

PIE的作用

安全性

PIE可以提高緩沖區(qū)溢出攻擊的門檻。它屬于ASLR(Address space layout randomization)的一部分。ASLR要求執(zhí)行程序被加載到內(nèi)存時,它其中的任意部分都是隨機的。包括
Stack, Heap ,Libs and mmap, Executable, Linker, VDSO。通過PIE我們能夠?qū)崿F(xiàn)Executable 內(nèi)存隨機化

節(jié)約內(nèi)存使用空間

除了安全性,地址無關代碼還有一個重要的作用是提高內(nèi)存使用效率。

一個共享庫可以同時被多個進程裝載,如果不是地址無關代碼(代碼段中存在絕對地址引用),每個進程必須結合其自生的內(nèi)存地址調(diào)用動態(tài)鏈接庫。導致不得不將共享庫整體拷貝到進程中。如果系統(tǒng)中有100個進程調(diào)用這個庫,就會有100份該庫的拷貝在內(nèi)存中,這會照成極大的空間浪費。

相反如果被加載的共享庫是地址無關代碼,100個進程調(diào)用該庫,則該庫只需要在內(nèi)存中加載一次。這是因為PIE將共享庫中代碼段須要變換的內(nèi)容分離到數(shù)據(jù)段。使得代碼段加載到內(nèi)存時能做到地址無關。多個進程調(diào)用共享庫時只需要在自己的進程中加載共享庫的數(shù)據(jù)段,而代碼段則可以共享。

PIE工作原理簡介

延伸閱讀

學習是年輕人改變自己的最好方式-Java培訓,做最負責任的教育,學習改變命運,軟件學習,再就業(yè),大學生如何就業(yè),幫大學生找到好工作,lphotoshop培訓,電腦培訓,電腦維修培訓,移動軟件開發(fā)培訓,網(wǎng)站設計培訓,網(wǎng)站建設培訓學習是年輕人改變自己的最好方式