程序開啟的保護機制我們可以通過 pwntools 自帶的 checksec 來檢查出來。
(bugkuctf-pwn2-開啟的保護機制)
1.Canary
Canary, 金絲雀。金絲雀原來是石油工人用來判斷氣體是否有毒。而應用於在棧保護上則是在初始化一個棧幀時在棧底(stack overflow 發生的高位區域的尾部)設置一個隨機的 canary 值,當函數返回之時檢測 canary 的值是否經過了改變,以此來判斷 stack/buffer overflow 是否發生,若改變則說明棧溢出發生,程序走另一個流程結束,以免漏洞利用成功。 因此我們需要獲取 Canary 的值,或者防止觸發 stack_chk_fail 函數,或是利用此函數。
2.ALSR
Address space layout randomization,地址空間布局隨機化。通過將數據隨機放置來防止攻擊。
3.Relro
Relocation Read Only, 重定位表只讀。重定位表即.got 和 .plt 兩個表。
4.NX
Non-Executable Memory,不可執行內存。了解 Linux 的都知道其文件有三種屬性,即 rwx,而 NX 即沒有 x 屬性。如果沒有 w 屬性,我們就不能向內存單元中寫入數據,如果沒有 x 屬性,寫入的 shellcode 就無法執行。所以,我們此時應該使用其他方法來 pwn 掉程序,其中最常見的方法為 ROP (Return-Oriented Programming 返回導向編程),利用棧溢出在棧上布置地址,每個內存地址對應一個 gadget,利用 ret 等指令進行銜接來執行某項功能,最終達到 pwn 掉程序的目的。
5.PIE