@Puzzor
头一次做弱点分析报告,整体下来感觉过程比较复杂艰难,此漏洞也比较早了,是12年下半年的一个,后续会带来更新更深入的分析。
调试环境:
Windbg
Adobe FlashPlayer 11.3.300.257
Windows XP SP2 简体中文
IDA Pro
调试过程:
样本链接中有两个swf文件,1.swf没有进行exploit,仅会造成程序的Crash,不具有危害性。 2.swf中进行了exploit并激活了shellcode,故在对2.swf进行测试时,请利用虚拟机进行。
首先打开Iexplore,利用windbg附加到iexplore进程中之后go一下。此时用IE打开我们已经准备好的1.swf,打开后,IE会弹出安全提示
点允许后会触发一个crash并引发windbg的中断,windbg中断信息如下:
可以看到在0x1043ce98处的call指令出现了异常,此时EAX :0x1e0d0000,要访问的地址为0x1e0d0008,而此处的内存并不可访问,所以会造成程序的Crash.接下来我们对指令进行回溯可以发现
EAX的值由ESI地址传递过来,而ESI的值又与ESP的值有关。一般来说ESI与调用函数的参数有紧密关系,而ESP一般指向栈帧的顶部。此时由EAX的值出现异常推出了ESP的值出现了异常,接下来就是要找出是什么原因造成了ESP值的异常。我们观察ESP的值为
由此值以及简单的堆栈回溯便可以算出此函数过程的返回地址为0x10440e65,这个返回地址也正处于存在问题的函数中
接下来,在内存中跳转到0x10440e65,如下图所示
可以看到0x10440e5f处对esi进行了push,紧接着call 0x1043ce89,这也证实了之前我们所说的ESI作为函数的一个参数进行传递,接下来就是要找出0x10440e5f处于哪一个模块。
我们查看一下当前所载入的模块
从上图我们可以看出,0x10440e5f正处于Flash32_11_3_300_257.ocx模块之中,至此我们已然能够确定漏洞出现在这个文件当中了。
接下来我们要找出具体这个漏洞存在于整个模块中的哪个函数中,我们利用IDA不难发现,0x10440e5f恰恰处于sub_10440CC5 proc near函数中。至此我们能够判断漏洞出现于此函数中。找出所在函数后,接下来我们将会用到下一个样本文件2.swf,此文件进行了exploit
接下来我们要定位shellcode,这次我们将断点设置在0x1043ce98上面,这个地址也是刚才出现crash的地址。接着从ie里面打开2.swf文件,程序会中断在断点处。此时我们跳转到0x0c0c0c0c,会发现地址段内布满了0x0c
在这里,堆栈被Spray了大量的0x0c+shellcode,通过指令的跳转我们继续向下执行,会找到shellcode的入口处
至此,指令落入shellcode.