1. 程式人生 > 實用技巧 >checksec與二進位制保護機制

checksec與二進位制保護機制

參考: https://www.it610.com/article/1295251903365586944.htm

1.Relro:Full Relro(重定位表只讀)

Relocation Read Only, 重定位表只讀。重定位表即.got 和 .plt 兩個表。
此項技術主要針對GOT改寫的攻擊方式,它分成兩種,Partial RELRO和FULL RELRO Partial 。
(部分)RELRO容易受到攻擊,例如攻擊者可以atoi.got為system.plt進而輸入/bin/sh\x00獲得shell,完全RELRO使整個GOT只讀,從而無法被覆蓋,但這樣會大大增加程式的啟動時間,因為程式在啟動之前需要解析所有的符號。

2.Stack:No Canary found(能棧溢位)

  Canary, 金絲雀。金絲雀原來是石油工人用來判斷氣體是否有毒。
而應用於在棧保護上則是在初始化一個棧幀時在棧底(stack overflow 發生的高位區域的尾部)設定一個隨機的 canary 值,當函式返回之時檢測 canary 的值是否經過了改變,以此來判斷 stack/buffer overflow 是否發生,若改變則說明棧溢位發生,程式走另一個流程結束,以免漏洞利用成功。 因此我們需要獲取 Canary 的值,或者防止觸發 stack_chk_fail 函式,或是利用此函式。

3.NX: NX enable(不可執行記憶體)

Non-Executable Memory,不可執行記憶體。瞭解 Linux 的都知道其檔案有三種屬性,即 rwx,而 NX 即沒有 x 屬性。如果沒有 w 屬性,我們就不能向記憶體單元中寫入資料,如果沒有 x 屬性,寫入的 shellcode 就無法執行。所以,我們此時應該使用其他方法來 pwn 掉程式,其中最常見的方法為 ROP (Return-Oriented Programming 返回導向程式設計),利用棧溢位在棧上佈置地址,每個記憶體地址對應一個 gadget,利用 ret 等指令進行銜接來執行某項功能,最終達到 pwn 掉程式的目的。

4.PIE: PIE enable(開啟ASLR 地址隨機化)

Address space layout randomization,地址空間佈局隨機化。通過將資料隨機放置來防止攻擊。
PTE(Position-Independent Executable,位置無關可執行檔案)技術與ASLR技術類似,ASLR將程式執行時的堆疊以及共享庫的載入地址隨機化,而PIE及時則在編譯時將程式編譯為位置無關,即程式執行時各個段(如程式碼但等)載入的虛擬地址也是在裝載時才確定。在PIE和ASLR同時開啟的情況下,攻擊者將對程式的記憶體佈局一無所知,傳統改寫GOT表項也難以進行,因為攻擊者不能獲得程式的.got段的虛地址。

總結

各種安全選擇的編譯引數如下:

NX:-z execstack / -z noexecstack (關閉 / 開啟)
Canary: -fno-stack-protector /-fstack-protector / -fstack-protector-all (關閉 / 開啟 / 全開啟)
PIE:-no-pie / -pie (關閉 / 開啟)
RELRO:-z norelro / -z lazy / -z now (關閉 / 部分開啟 / 完全開啟)