Protection - ianchen0119/About-Security GitHub Wiki
檢查保護機制
使用 gdb 執行目標程式後,輸入:
checksec
即可查看該程式啟用了哪些保護機制。
CANARY
+-----------+
| ... |
+-----------+
| buffer |
+-----------+
| ... |
+-----------+
| Canary |
+-----------+
| Saved rbp |
+-----------+
| ret addr |
+-----------+
在 buffer 的下方放置隨機字串,避免 overflow 時損壞重要的資料。
此外, Stack Canary 會在程式 return 之前檢查該隨機字串的內容是否有變,如果變動了就代表有 bufferoverflow 的問題,此時該程式就會 abort
。
如果要關閉 Canary ,需要在編譯時加入 -fno-stack-protector
。
gcc -fno-stack-protector -o test main.c
FORTIFY
FORTIFY 用於檢查 bufferflow ,當程式使用了大量的 string op 或是 memory op (如: memcpy
, memset
, strcpy
, sprintf
, gets
...) ,可以在編譯時啟用 FORTIFY 。
編譯時檢查:
gcc -D_FORTIFY_SOURCE=1
每次執行時檢查:
gcc -D_FORTIFY_SOURCE=2
NX
NX 又稱為 Data Execution Prevention (DEP) ,主要用來防範注入惡意 shellcode 的問題。 基本上, NX 就是讓:
- 可寫的區段不可執行
- 可執行的區段不可寫 所以在解 shell code 類型的題目時需要關閉 NX :
gcc test.c -z execstack -o test
PIE
Position-Independent Executable (PIE) ,用於將執行檔的 Data 以及 Code section 噴進隨機化的記憶體位址,大大提高被利用的難度,關閉 PIE 的方式為:
gcc test.c -no-pie -o test
RELRO
- disabled: 歡迎光臨 Myfone :3
- partial: 僅 .got.plt 可寫, Linkmap 不可寫
- full: [READ-ONLY]
RELRO 的關閉方式:
gcc -z norelro -o test test.c
ASLR
Address space layout randomization (ASLR) 是作業系統對 Process 的保護機制,會對 Stack, Heap, library 的位址進行部分隨機化。 關閉方式:
# echo 0 > /proc/sys/kernel/randomize_va_space