​​​​​​​CVE-2010-3333分析

1.漏洞背景

    RTF中“pFragments”属性存在栈溢出,远程攻击者可以借助特制的RTF数据执行任意代码。

Alt text
    RTF分析器在解析pFragments属性值时,没有正确计算属性值所占用的空间大小,导致栈溢出漏洞的发生, 
    后面有个图里圈出了要复制的数据大小以及数据。

2.漏洞成因

    使用msf生成漏洞文档后,用windbg打开,在30e9eb88处发生了访问异常。

Alt text
    在0x30e9eb88处,将esi处的数据复制到edi时发生访问异常。是在mso.dll模块发生的。此时esi=1104c24c,edi=00130000。查看edi内存属性,为只读,因此触发了访问异常。

Alt text
    重新附加程序调试,在0x30e9eb88处下断点,运行,打开漏洞文档。在0x30e9eb88处断下此时还未复制数据,edi=00123dc0。使用ub命令 反汇编当前ip寄存器地址的前8条指令,得到0x30e9eb88所处函数为sub_30e9eb62

Alt text
    返回地址为0x30f4cdbd的函数调用了sub_30e9eb62,通过反汇编指令可以得到该函数为sub_30f4cc5d

 

Alt text

Alt text
    在0x30f4cc5d处下断点,断到了这个函数里面,按p单步执行,直到调用sub_30e9eb62处

Alt text
    单步步入跟踪该函数。rep movs指令复制内存时ecx=0xc8ac字节,因为复制的是dword类型的数据,因此数据的大小需要除以4,得到0x322b

Alt text
    此处复制的数据以及数据大小可以在rtf文件的开头处找到。

Alt text

 

Alt text

Alt text
    sub_30f4cc5d函数分配了0x14字节的栈空间,而复制数据大小为322b,肯定会发生栈溢出。在执行复制操作之前edi=123dc0,ebp=123dd0,一共只剩下0x10字节的空间可以用来存储数据(0x4是用来存储前ebp的),数据大小超过0x10,将会覆盖前EBP,再大一点就会覆盖sub_30f4cc5d函数的返回地址。

Alt text

 Alt text

 

3.漏洞利用

3.1 jmp esp

    没有写shellcode,只记录一下利用方法。进行利用的时候记得修改rtf开头处数据大小为shellcode的大小,不然一直复制下去,可能就又访问异常了。 
    shellcode的前0x14字节数据可以是垃圾数据。再往下复制会覆盖调用sub_30e9eb62的函数的返回地址,该地址存储在00123dd0处,值为30f4cdbd。复制操作会从00123dc0开始,构造0x14大小的垃圾字节,在后面跟上jmp esp的地址,因为函数sub_30f4cc5d返回后会释放0x14的栈空间,因此,在jmp esp后面也填上0x14大小的垃圾字节,之后便跟着shellcode即可。

Alt text 
    复制完之后执行retn 0xC,栈如下:

Alt text
    在出了sub_30e9eb62函数之后并不是执行一会就会出sub_30f4cc5d,在sub_30e9eb62函数结束之后,会对00123DE4处的值进行一个判断,若为0则正常执行,shellcode继续利用,若不为0则触发异常,执行office自己的异常处理函数。判断会在sub_30F4CB1D函数中进行。 
    retn 0xC之后有个push操作,将ebp+0x18=00123DE4处的值压栈,压完后栈顶为00123DAC,之后调用了30F4CB1D函数。

Alt text
    该函数分配了0xC大小的栈空间,此时ebp为00123D90,之后会将ebx(0)与ebp+0x10处的值进行比较,是否为0,为0则跳转。ebp+0x10=123DAC。即,若想要在此处跳转,00123DAC必须为0,即为00123DE4处值必须为0,构造shellcode的时候要注意将此处值构造为0。

Alt text
    跳转之后,执行到sub_30f4cc5d函数的最后一条指令retn 0x14,此时esp=00123DD4,执行完此条指令,释放0x14的栈空间,esp=00123DEC,jmp esp便是跳到这里了,shellcode在这之后就可以执行了。

3.2 利用SEH异常处理结构

3.2.1 call dword ptr[ebp+0x30]

    用构造的数据覆盖异常处理函数,使其可以指向shellcode入口地址,然后触发异常就会执行异常处理函数也就可以执行shellcode了。 
    书上写的是用call dword ptr[ebp+0x30]覆盖异常处理函数,然后执行完该语句,会跳到next SEH,再将next SEH的处的值覆盖为jmp 06,jmp 04,跳过SEH handler,在SEH结构之后放一个回跳指令,跳到shellcode处。 
    前面在3.1中说过了,在复制完成之后会对00123DE4处的值进行判断是否为0,若是不为0,则会触发office内部异常处理例程,因此把这个值填充成0,再触发异常,调用覆盖后的SEH处理函数。 
    还差实验,,,

3.2.2 构造ROP链

    用mona构造ROP链跳到shellcode起始地址。没写完,但是不想写了,写文档好累啊,前面想着把栈回溯也写一下,实在是不想写了,等想写了再写吧,,,,,,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值