来看雪论坛很久了,一直都在download别人的资源,有点说不过去...今天发一篇关于CVE-2010-3333的漏洞分析,不求有多大的作用,只希望和我一样的新手看了有点体会,互相交流... 那么,开始咯~ 实验环境:win xp+word 2003+Ollydbg 一打开poc就可以看到万能跳转(jmp esp)地址的存在。如图1所示。 图1 那么该漏洞的调试就可以从这个地址入手了。 打开OD后,载入winword.exe,ctrl+g给7ffa4512下断点。如图2所示 图2 找到该地址后,由于该地址的特殊性,只能给它下硬件断点。 随后按下F9执行该程序。几秒后,打开了word.exe程序,然后点击“文件”->“打开”,载入我们的POC。 果断程序停在了我们 所设置断点的地方,如图3所示。 图3 这是我们可以观察寄存器的值,很明显是发生了溢出才导致了这些不正常值的出现。 按F8单步执行下去后,我们就可以看到程序跳进了shellcode区域去执行。 这个时候我们观察栈区的数据,或许可以发现程序的调用。 图4 从图4中可以看出,在跳转到jmp esp地址之前,word程序调用了mso模块中的地址为:30f4ccb1的函数,难道就是该函数发生了问题??我们在此地址下下断点,来看看!如图5 图5 找到该地址,然后下断点。然后重新载入该程序。 图6 果断程序妥妥的停在了我们刚设置断点的地址,如图6。 这个时候,我们继续观察战中的变化,看shellcode是否已经被copy到栈区。 图7 从图7中可以看到,shellcode已经被拷贝到了栈区,那么也就是说明溢出的过程和这个函数无关。我们只能继续往上寻找,查找在调用这个函数之前是哪个函数出了问题。这个时候我们发现,在它上面有个函数调用,难道是这个函数的问题? 图8 为了验证图8中的问题,我们对该函数调用的任意一行指令下断点。看那时候栈区的情况,如图9。 图9 然后重新载入程序。 图10 同样,在此时,栈区数据又已经被shellcode所覆盖.如图10。没办法,我们只能继续往上走。 我将断点设置在此处,如图11。 图11 重新载入程序后运行。 然后我们发现发现这个时候shellcode并未覆盖该栈区。如图12所示。 图12 经过对断点前后代码的简单分析,我们确定了溢出的过程就是图13中的那个函数中。 图13 于是我们按F8单步调试,然后F7进入该函数的调用。为了时刻观察栈区数据什么时候覆盖,我们可以用锁定堆栈的方法来时刻监控。 根据跟踪的状态,发现执行了这一步(图14中所示)之后,栈区的数据就被覆盖了。 图14 30E9EB88 F3:A5 rep movs dword ptr es:[edi], dword ptr [esi] 这一条指令的意思就是说:将esi所指向的串移动到edi所指向的区域,移动的次数为ecx次。那么,很显然,由于移动的次数比预期的多了,所以才造成了这次的栈溢出。那么我们可以确定是ecx大小问题,是由于程序没有对ecx的大小做检查么? 在程序的上面,我们看到,程序有对ecx的长度进行检查,但是明显检查的不够合理。如图15 图15 进行图15的检查,ecx的值的范围可以在0000h-1111h,明显不太合理,但是分配给他的空间有多少呢?我们继续往上查看。 图16 如图16,他分配的大小只有0x10,也就是说rep的次数只能是2次。但是由于这个ecx值的大小未受到合理的检查,所以才导致了该溢出。 最后欢迎大家和我交流讨论,共同进步。 附上调试POC: CVE-2010-3333.rar 留下QQ邮箱: [EMAIL="695473585@qq.com"]695473585@qq.com[/EMAIL]
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)