Stack Canary 的機制就是在 Saved RBP 前加上一個 Radom 值,若該值被修改,則會產生 Stack Smashing Detected 事件,並直接結束程式執行。
有 canary 的話不能蓋到 return address、rbp
主要防範 Buffer Over Flow 造成的延伸安全問題。
關閉方式:
gcc $Source -fno-stack-protector -o $Binary
全名為 Data Execution Prevention,又稱 NX (No eXecute)
主要防範 Shell Code 造成的安全問題。
關閉方式:
gcc $Source -zexecstack -o $Binary
位址空間組態隨機化(ASLR, Address space layout randomization),主要是作業系統上對於 Process 的防護機制,會使每次執行 Stack、Heap、library 位址隨機化,進而達到一些保護效果。不過並非真正隨機,最後12bits 是固定的。
關閉方式:
# echo 0 > /proc/sys/kernel/randomize_va_space
全名為 Position-Independent Executable,主要影響的範圍為 Program Structure 的 Data、Code 段,讓該地方的記憶體位置隨機化,來增加被利用的難度。Ubuntu 16.04 預設關閉。
關閉方式:
gcc $Source -no-pie -o $Binary
RELRO 全名為 RELocation Read Only。共有三種保護模式,分別為 No / Partial / Full。
No RELRO
- Link Map、GOT 可寫Partial RELRO
- Link Map 不可寫、GOT 可寫Full RELRO
- Link Map、GOT 皆不可寫主要適用於防範 Lazy Binding 所造成的延伸問題。
關閉方式:
gcc $Source -o $Binary // 默認情况下,是 Partial RELRO
gcc -z norelro $Source -o $Binary // No RELRO
gcc -z lazy $Source -o $Binary // Partial RELRO
gcc -z now $Source -o $Binary // Full RELRO