1. 程式人生 > >0day 第10章 --攻擊異常處理突破GS(2)

0day 第10章 --攻擊異常處理突破GS(2)

實驗原理:

傳入引數過長,直到覆蓋掉SEH控制代碼。將SHE控制代碼覆蓋為shellcode地址即可。

實驗環境:

Winxp sp3 vs2010 Release版本、禁用優化、多了後面2個“否”(這樣編譯的程式就出現strcpy和strcat函數了,便於分析) 僅僅是這兩個否,之後的程式分析就和書中一樣了! 在這裡插入圖片描述 傳說中的關閉safeseh的方法。。。 在這裡插入圖片描述

源程式:

用200個’\x90’進行測試 在這裡插入圖片描述 OD載入程式,在呼叫test()函式之前,記錄下此時的返回地址00141071和EBP為 0012FF7C 在這裡插入圖片描述 進入,首先單步看到security_cookie的值:0xAAA8d089 在這裡插入圖片描述 出現strcpy和strcat函數了。strcpy(buf,input)的的input地址是0x00403000,buf地址是0x0012FEA0 在這裡插入圖片描述

此時仔細觀察右下角堆疊視窗,發現input的地址在0x0012FF78處,這樣當接下來呼叫strcat時,如果shellcode過長就會覆蓋strcat(buf,input)的地址,就會導致異常! 在這裡插入圖片描述 F7單步,果然,strcat()從0x0012FF78處呼叫取input的地址了! 在這裡插入圖片描述 F7單步繼續,strcat(buf,input)buf的地址正確, 在這裡插入圖片描述 F8執行完strcat函式,發現程式直接調到ntdll.dll模組了。這時觀察堆疊視窗,發現SHE控制代碼竟然被覆蓋成0x90909090了!這是怎麼回事呀? 在這裡插入圖片描述 仔細想一下……噢~明白了,原來剛strcat(buf,input)取地址的時候兩個地址都是正確的,自然就將input的內容複製到buf的後面了,因為我們輸入的input有200個位元組長,因此當他們連線時,自然就覆蓋了SEH控制代碼了,因為SHE控制代碼和buf末尾只相差了76個位元組呀! 程式一會肯定會報錯! 單步繼續,果然由於90909090不可讀導致出錯了! 在這裡插入圖片描述
這下分析完了導致異常的原因,那我們就構造200+76個位元組的shellcode,然後跟上shellcode的地址讓其覆蓋掉SHE控制代碼,觀察是否能shellcode成功! 在這裡插入圖片描述 啊噢,執行直接報緩衝區溢位錯誤。。。。 在這裡插入圖片描述 查資料發現原來winxp sp2及後續版本中加入了對SHE的校驗,因此失敗了。 這就沒辦法了。 #end