https://www.exploit-db.com/exploits/48389

环境

Windows7 SP1 x86

分析

运行CloudMe.exe后,软件会在8888端口监听,我们可以用socket向端口send数据,这也是漏洞的触发方法。

exploit-db中的poc是用来弹计算器的,不适合我们定位漏洞触发位置,所以需要修改一下:

1
s.send('A' * 1056)

1056个字符刚好覆盖到返回地址。

运行poc,触发崩溃:

查看到返回地址为0x22ab4c。

然后我们用一条非常精妙的条件断点语句,即可定位到触发的位置。这条语句的意思是,如果有指令往0x22ab4c内存处写入4个字节,并且写入的是0x41414141那么就自动断下。

1
ba w 4  0x0022ab4c ".if(poi(0x0022ab4c)=0x41414141){};.else{gc;}"

安装断点,按g运行,发现程序定在了memcpy处。

通过栈帧回溯到上层函数:

可以看到memcpy的调用位置是

1
68b08e80 e80bff2200      call    Qt5Core!ZN16QEventTransition11qt_metacallEN11QMetaObject4CallEiPPv+0x55830 (68d38d90)

这实际是一个跳转指令,它将会跳转到memcpy。

我们用IDA反编译Qt5Core.dll,定位到68b08e80,可以发现它就是memcpy。

我暂时还没搞清楚这个函数和8888端口的关系。

利用

利用思路非常简单,将shellcode布置到返回地址后面,直接修改返回地址为jmp esp之类的指令,exploit-db中作者用的是push esp ret