對於 ASLR 和 PIE 一直沒有系統歸納,部分概念時常混淆,做個筆記記錄一下。
ASLR 是什麼?
ASLR 是 Linux操作系統的功能選項,作用於程序(ELF)裝入內存運行時。是一種針對緩衝區溢出的安全保護技術,通過對加載地址的隨機化,防止攻擊者直接定位攻擊代碼位置,到達阻止溢出攻擊的一種技術。
開啓、關閉ASLR
查看當前系統ASLR的打開情況:
sudo cat /proc/sys/kernel/randomize_va_space
ASLR 有三個安全等級:
- 0: ASLR 關閉
- 1:隨機化棧基地址(stack)、共享庫(.so\libraries)、mmap 基地址
- 2:在1基礎上,增加隨機化堆基地址(chunk)
PIE 是什麼?
PIE 是 gcc 編譯器的功能選項,作用於程序(ELF)編譯過程中。是一個針對代碼段( .text )、數據段( .data )、未初始化全局變量段( .bss )等固定地址的一個防護技術,如果程序開啓了PIE保護的話,在每次加載程序時都變換加載地址,從而不能通過 ROPgadget 等一些工具來幫助解題。
開啓 PIE
在使用 gcc 編譯時加入參數-fPIE
。
PIE 開啓後會隨機化代碼段( .text )、初始化數據段( .data )、未初始化數據段( .bss )的加載地址。
總結
作用位置 | 歸屬 | 作用時間 | |
---|---|---|---|
ASLR | 1:棧基地址(stack)、共享庫(.so\libraries)、mmap 基地址 2:在1基礎上,增加隨機化堆基地址(chunk) |
系統功能 | 作用於程序(ELF)裝入內存運行時 |
PIE | 代碼段( .text )、初始化數據段( .data )、未初始化數據段( .bss ) | 編譯器功能 | 作用於程序(ELF)編譯過程中 |