上篇office漏洞提到了棧溢出,查了下棧溢出屬於PWN范疇,專門找了講棧溢出的資料和書籍來看,嘗試復現經典棧溢出(關閉地址隨機化那種),嘗試了N次,每次都失敗了。>_<。都是卡在計算目標buffer的偏移這里,反正按照網上的方法都木有成功過,本機匯編出來的代碼也看不懂,所以暫時放棄了。。。
今天准備做ctf,發現有pwn的題,新手區的第一題:
大佬們讓我不要看PWN,不然會禿頭,但是咱好奇啊,趁着脫發還不嚴重先看一下。題目肯定是不會的(不但不會做,還很理直氣壯哈哈哈),先找網上的writeup一步一步學習吧,希望學完不要掉頭發>_<
下載這個工具:https://github.com/slimm609/checksec.sh
checksec是一個bash腳本,用來檢測可執行文件的屬性,可執行文件屬性包括:PIE, RELRO, PaX, Canaries, ASLR, Fortify Sourc
檢測一下題目給出的附件:
hmmm...第一步就看不懂了...先停下來學習吧。
RELRO,CANARY,NX,PIE,FORTIFY都是Linux常用的保護機制。可在gcc編譯時通過相應的選項進行設置。
FORTIFY
在編譯的時候檢查源碼是否存在緩沖區溢出等錯誤。什么是緩沖區溢出?個人的粗淺理解是這樣的,舉個栗子:
#include <stdio.h> #include <string.h> int main(int argc, char* argv[]) { /* [1] */ char buf[256]; /* [2] */ strcpy(buf,argv[1]); /* [3] */ printf("Input:%s\n",buf); return 0; }
這段代碼沒有檢查入參的長度,如果傳入超過256個字符,就會造成緩沖區溢出。
NX(No-eXecute)
數據不可執行。原理是將數據所在內存頁標識為不可執行,防止因為程序運行出現溢出而使得攻擊者的shellcode可能會在數據區嘗試執行的情況。NX在咱屢戰屢敗的經典棧溢出實驗中有接觸過,NX是對棧和堆的一種保護機制。實驗需要關閉NX和地址隨機化,否則執行shellcode時,CPU就會拋出異常,而不是去執行惡意指令。
Linux系統叫做NX,Windows系統中類似的機制叫DEP(Data Execute Prevention)。
PIE/ASLR
地址隨機化。就是保證同一個程序任意兩次運行時的堆棧基址是不同的。如果堆棧基址不變會怎樣?不變就可能被攻擊,因為攻擊者能確認程序的內存地址,然后通過覆蓋返回地址在等手段執行惡意代碼。咱屢戰屢敗的經典棧溢出實驗就是通過覆蓋返回地址執行惡意代碼。
STACK CANARY
棧保護。棧溢出保護是一種緩沖區溢出攻擊緩解手段。啟用棧保護后,函數開始執行的時候會先往棧里插入cookie信息,當函數真正返回的時候會驗證cookie信息是否合法,如果不合法就停止程序運行。攻擊者在覆蓋返回地址的時候往往也會將cookie信息給覆蓋掉,導致棧保護檢查失敗而阻止shellcode的執行。在Linux中我們將cookie信息稱為canary。
簡單來說就是通過驗證cookie,來判斷執行的代碼是不是惡意代碼。艾瑪,我居然懂了,看來咱屢戰屢敗的經典棧溢出實驗也不是一無是處。
RELRO(Relocation Read Only)
只讀重定位。設置符號重定向表格為只讀或在程序啟動時就解析並綁定所有動態符號,從而減少對GOT攻擊。GOT是全局函數表,它是干什么的請參考:https://www.zhihu.com/question/21249496。
在Linux中有"Partial RELRO" "Full RELRO"兩種模式,默認開啟Partical RELRO,開啟Partical RELRO時,GOT是可寫的,開啟 FULL RELRO 時,GOT表是只讀的。
RPATH
程序運行時的環境變量
Symbols
暫時沒有查到相關資料
綜合以上,對guess_num這個程序的檢測結果:開啟了NX,地址隨機化,棧保護,以及Partial RELRO。
本文僅用於技術學習和交流,嚴禁用於非法用途,否則產生的一切后果自行承擔。
如需轉載,請注明出處,這是對他人勞動成果的尊重。