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