ASLR,PIE,PIC的相似處及區別

之前一直都以爲ASLR和PIE是相同的東西,看了蒸米大佬的一步一步學rop和查看很多文章後,才意識到其中的區別的,記下筆記方便複習。只有把這幾個機制弄清楚了,才能知道哪些地址是動的,哪些是不動的,寫exp的時候才能寫出通解。

百度百科關於ASLR(Address space layout randomization)的說法如下:

aslr是一種針對緩衝區溢出的安全保護技術,通過對堆、棧、共享庫映射等線性區佈局的隨機化,通過增加攻擊者預測目的地址的難度,防止攻擊者直接定位攻擊代碼位置,達到阻止溢出攻擊的目的的一種技術。

查看當前系統ASLR的打開情況:

cat /proc/sys/kernel/randomize_va_space

如果是0,代表ASLR關閉,
如果是1,是部分隨機化,棧,共享庫,vdso隨機化。
如果是2,代表在1的基礎上,堆也被隨機化了。

開啓ASLR後,每次啓動程序,libc.so的基址就會發生變化:
在這裏插入圖片描述
將其值修改爲2,然後查看動態庫基址:
在這裏插入圖片描述

但是ASLR並不會隨機化自身程序的代碼段和數據段。
(圖片來自蒸米大佬的一步一步學rop http://www.vuln.cn/6645
在這裏插入圖片描述
也就是說程序的加載還是從低地址0x08048000開始的。ASLR影響的只是堆,棧,和動態庫的基址,並不會影響程序加載的基址
想要影響程序本身加載的基址,就需要開啓PIE(position Independent executable ),開啓PIE後,將本身程序也標記成爲一種特殊的.so文件,所以依賴於ASLR的開啓。簡而言之就是開啓PIE就必須開啓ASLR。

PIC(position Independent code)就是位置無關代碼,和動態庫有關(有關靜態鏈接和動態鏈接可以看《深入理解計算機系統》這本書)。
之前以爲PIC開啓後,每次啓動程序後,動態庫的基址本來就是變化,其實在不開ASLR的情況下,同一臺機器上libc.so加載的基址是相同的,關機後再測試依然是相同的,不同機器上libc.so加載的基址纔是不同的。
以同一臺機器爲例:
在這裏插入圖片描述
不同虛擬機爲例:
在這裏插入圖片描述
在這裏插入圖片描述
動態庫加載的基址都是不同的。(libc.so的版本都是相同的)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章