ELF 是 Executable and Linkable Format 的縮寫,可以簡單稱為可執行檔。不同平台有不同的可執行檔格式,如 Windows 的 exe 和 Linux 的 ELF。而 ELF 檔又包含各種區段 (Section),這些區段在執行時會映射 (mapping) 到記憶體中。常見的區段包括:.text、.bss、.data、.rodata、.got、.plt 等。以下是對這些區段的介紹:
以下是一段程式碼中各段落存在的區段
#include <stdio.h>
int a; // .bss
int b = 100; // .data
// .text start
int main(){
puts("Hello World!"); // .rodata
return 0;
}
// .text end
各區段皆可能成為後續內容可以利用的部分,不過目前可以先看過即可,後續講述到攻擊手法時會再進一步介紹
一個 ELF 檔會有許多保護機制,並且可以在編譯時加入參數決定是否要開啟,而開啟的多寡就可能同時決定這個 ELF 檔會有什麼樣的攻擊手法可以利用。以下是常見的保護機制:
gcc main.c -no-pie
echo 0 > /proc/sys/kernel/randomize_va_space // 關閉
echo 1 > /proc/sys/kernel/randomize_va_space // 半隨機
echo 2 > /proc/sys/kernel/randomize_va_space // 全隨機
gcc main.c -zexecstack
gcc main.c -fno-stack-protector
gcc main.c –fstack-protector // 動態配置記憶體或 buffer > 8bytes 的函數加入
gcc main.c –fstack-protector-all // 所有 function 都加入
gcc main.c –fstack-protector-strong // -fstack-protector 的條件及程式內有 local 變數為陣列類型或變數位址用來賦值或當作函式參數或以 register 類型宣告的 local 變數
gcc main.c –fstack-protector-explicit // 只對以 __attribute__((stack_protect)) 宣告的 function 加入
gcc -z norelro main.c // No RELRO
gcc -z lazy main.c // Partial RELRO
gcc -z now main.c // Full RELRO
保護 | Link Map | GOT |
---|---|---|
No | O | O |
Partial | X | O |
Full | X | X |