之后,会运行计算器程序。
f四、漏洞详细分析漏洞详细分析
1、准备环境。Xpsp3,ie60。2、用OD把IE60打开,然后让IE去加载POC,顺利弹出了计算器,同时IE发生异常中断下来,此时去看堆栈信息,会发现栈上的数据基本已经被ODOD覆盖了,此时只有通过查看地址更高的栈位置(如果使用wi
dbg可以使用栈回溯功能)来定位有效栈位置和返回到pdg2模块的地址。
3、通过栈回溯找到了pdg2模块中的3个地址(如下图),减掉pdg2模块的基址(基址每次都不一样,需要调试时查看),获得两个偏移1CDAB和15AE9,获取这两个偏移的目的是为了重新调试时提前下断点(027ecdab027d0000;027e5ae9027d0000)。
f4、重新启动od进行调试,勾选中断于新模块,在PDG2模块加载中断时,记下pdg2的新模块基址,并设置断点,需要注意是设置上一条指令为断点,因为第三步获得偏移是返回地址了(如图所示)。
5、取消中断于新模块,继续运行,直到od中断下来,程序中断在之前设置的断点,调用WideCharToMultiByte时,此时的宽字符已经是POC传入的ODOD字符串,而存放转换后的字符串缓冲区则有ESI来指明,查看前面的汇编代码会发现缓冲区是一段栈上面的空间,执行完之后,栈上面就全是拷贝的0D0D0D0D数据了,但是EIP还是正常的,继续走几个函数(这个地方要多调试几次,运用二分法来确定溢出点,下面的几个函数都是在使用转这个地方要多调试几次,这个地方要多调试几次运用二分法来确定溢出点)换后的缓冲区用作参数。
6、真正触发漏洞的是下面这个函数,最后一条指令ret8执行前,此时堆栈的栈顶指向的数据已经全部都是0D0D0D0D了,再往下执行EIP就被接管了。
f027E3DC0027E3DC6027E3DC8027E3DCB027E3DCD027E3DCE027E3DCF027E3DD0027E3DD7027E3DD9027E3DDB027E3DDD027E3DE1027E3DE3027E3DE5027E3DE7027E3DEADS027E3DEC027E3DEE027E3DF4027E3DF7027E3DFA027E3DFC……027E3F1A027E3F1B027E3F1C027E3F1E027E3F1F027E3F25
81EC0C010000SUBESP10C8BD1MOVEDXECX83C9FFORECXFFFFFFFF33C0XOREAXEAX53PUSHEBX56PUSHESI57PUSHEDI8BBC2420010000MOVEDIDWORDPTRSSESP120F2AEREPNESCASBYTEPTRESEDIF7D1NOTECX2BF9SUBEDIECX8D5C2418LEAEBXDWORDPTRSSESP188BC1MOVEAXECX8BF7MOVESIEDI8BFBMOVEDIEBXC1E902SHRECX2F3A5REPMOVSDWORDPTRESEDIDWORDPTR8BC88B82943F000083E10383F801F3A40F85180100005F5E32C05B81C40C010000C20800MOVECXEAXMOVEAXDWORDPTRDSEDX3F94ANDECX3CMPEAX1REPMOVSBYTEPTRESEDIBYTEPTRDSJNZpdg2027E3F1APOPEDIPOPESIXORALALPOPEBXADDESP10CRETN8
可以看下面的图片说明:
f通过IDA查看会比较明显:
fr