# PWN 保護機制 ###### tags: `pwn` ## 全部關閉 ```gcc test.c -fno-stack-protector -zexecstack -no-pie -o test``` ## Canary ``` gcc $Source -fno-stack-protector -o $Binary ``` ## NX (No eXecute) 全名為 Data Execution Prevention,又稱 DEP 可以寫的,不可以執行。 可以執行的,不可以寫。 主要防範 Shell Code 造成的安全問題。 關閉方式: ``` =bash gcc $Source -zexecstack -o $Binary ``` ## ALSR - 位址空間組態隨機化(ASLR, Address space layout randomization),主要是作業系統上對於 Process 的防護機制,會使每次執行 Stack、Heap、library 位址隨機化,進而達到一些保護效果。不過並非真正隨機,最後12bits 是固定的。 關閉方式: ``` =bash # echo 0 > /proc/sys/kernel/randomize_va_space ``` ## PIE  全名為 Position-Independent Executable,主要影響的範圍為 Program Structure 的 Data、Code 段,讓該地方的記憶體位置隨機化,來增加被利用的難度。Ubuntu 16.04 預設關閉。 關閉方式: ``` gcc $Source -no-pie -o $Binary ``` ## RELRO (RELocation Read Only) - 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 ## 各型態大小 ``` c= BYTE = 8 BIT CHAR = 1 BYTE INT = 4 BYTE DOUBLE = 8 BYTE LONG = 4 BYTE SHORT = 2 BYTE WORD = 2 BYTE DWORD = 4 BYTE = 32BIT ```