350 likes | 850 Vues
Buffer Overflow 原理簡介. 參考資料 : Smashing The Stack For Fun And Profit (By Aleph One). 逢甲大學資工所 平行實驗室 鍾宜勳. Stack 的運作方式 (1/9). Stack 的運作方式 (2/9). Stack 的運作方式 (3/9). Stack 的運作方式 (4/9). Stack 的運作方式 (5/9). Stack 的運作方式 (6/9). Stack 的運作方式 (7/9). Stack 的運作方式 (8/9). Stack 的運作方式 (9/9).
E N D
Buffer Overflow 原理簡介 參考資料: Smashing The Stack For Fun And Profit (By Aleph One) 逢甲大學資工所 平行實驗室 鍾宜勳
Stack向下成長,Array向上遞增. Stack的成長方向, 與Array的成長方 向剛好相反.
Array被寫入超過其容量的資料(Buffer Overflow) 造成Return Address和 SFP被覆寫
Buffer Overflow造成Return Address不正確 可能造成程式 Return到隨機 的Address去
Idea 1. 利用Return Address 利用Buffer Overflow可 以更改Return Address 的特性,透過巧妙的安排, 我們可以執行我們想執 行的任何程式區段.甚至 我們把code放在Stack 中,code也可以順利執行.
Idea 2. 取得Root權限的Shell 那個被我們Overflow 的執行檔,如果它的 suid是root的話,那麼 我們可以在overflow 時,產生一個shell出 來,而得到一個有root 權限的shell.然後我們 就可以為所欲為了.
Idea 3. 由命令列參數引發Buffer Overflow 在前面的二個Idea中,我們知 道Stack裡也可以執行code, 而且這樣的作法有機會可以 取得“具有Root權限的Shell” 來為所欲為,不過有幾個問題 要解決:Stack中要執行的 code要從哪來?Return Address要怎麼去更改?要 怎麼去buffer overflow別人 的程式?這個答案就是透過 命令列參數輸入code以及所 想要return的新位址. sh-2.04$./vulnerable $CODE
初步的作法 • 把要輸入Stack的code及return address放到環境變數中,這樣進行buffer overflow的輸入會方便許多. • 缺點:我們所需的return address很難求得,必需靠許多次的嘗試才能得到結果.
Shell Code • 欲輸入Stack的code,我們稱之為Shell code.其結構如下:
初步作法技術細節(1/3) • Shell Code的內容必需避免有00H的值.因為有的程式可能會用strcpy()等函式,將命令列參數予以複製並進行處理.這時,Shell Code如果有00H的值,將會被誤以為是字串結尾‘\0’,而使得Shell Code被複製的不完全,而喪失完整性,進而導致Code無法運作.我們也就沒辦法得到Shell了. • 透過暫存器與自己做xor運算,產生我們所需要的0,並且避免使用high word是0的立即值,使code中能夠不再有00H出現. • 例: movb $0x0,0x7(%esi) 代換成 xorl %eax,%eax
初步作法技術細節(2/3) • 透過使用環境變數,簡化輸入Shell Code的動作. sh-2.04$./vulnerable $CODE 輸入容易 shellcode[] = "\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00" "\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80" "\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff" "\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3"; 輸入不便
初步作法技術細節(3/3) • 要Buffer Overflow別人的程式,常常會算不準要Return的Address,我們可以在Shell Code前面增加一段nop指令來增加我們的成功機會.
Array太小無法成功Overflow • 不時會遇到左圖的情形,導致無法順利地跳到我們的Shell Code執行.所以必需予以改善.
進階作法技術細節 • 為了改善Array太小,無法動作的窘況.將Shell Code也移到環境變數中.Stack中只充填新的Return Address.
結論 • 透過Buffer Overflow的方式,我們可以不需要擁有root的password,就可以由一般使用者變成super user,進而掌控整個系統. • C語言並沒有bound checking的機制,所以使用C語言會讓我們不經意地,造就出系統安全上的漏洞.所以我們必需要自己去做bound checking的動作. Bound Checking,這是一定要的啦!!