CloudMe 1.11.2 - Buffer Overflow
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
。