暴风影音拒绝服务下载

mp4是由一个个“box”组成的,大box中存放小box,一级嵌套一级来存放媒体信息。

这里更改的部分是stsz box,它存放了mp4文件中的各个sample的大小

Mp4文件格式参考:http://www.cnblogs.com/haibindev/archive/2011/10/17/2214518.html

对于样本来说,关键结构如下:

更改完成后打开,程序崩溃。

===========================================================

VERIFIER STOP 00000004: pid 0xD70: extreme size request



01E40000 : Heap handle

EFFFFFFF : Size requested

00000000 :

00000000 :

===========================================================



(d70.e38): Break instruction exception - code 80000003 (first chance)

eax=00000000 ebx=efffffff ecx=7c93eb05 edx=190bf504 esi=00000004 edi=01e40000

eip=7c921230 esp=190bf738 ebp=190bf74c iopl=0 nv up ei pl zr na pe nc

cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246

ntdll!DbgBreakPoint:

7c921230 cc int 3

0:028> kbn

# ChildEBP RetAddr Args to Child

00 190bf734 7c9751ad efffffff 01e40000 01e40000 ntdll!DbgBreakPoint

01 190bf74c 7c98a48c 00000004 7c98a764 01e40000 ntdll!RtlApplicationVerifierStop+0x160

02 190bf7c8 7c98d628 01e40000 01001002 efffffff ntdll!RtlpDebugPageHeapAllocate+0x43

03 190bf84c 7c969d18 01e40000 01001002 efffffff ntdll!RtlDebugAllocateHeap+0x2d

04 190bfa7c 7c93b298 01e40000 01001002 efffffff ntdll!RtlAllocateHeapSlowly+0x44

*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\System32\verifier.dll -

05 190bfcb0 5ad5230b 01e40000 01001002 efffffff ntdll!RtlAllocateHeap+0xe64

*** ERROR: Module load completed but symbols could not be loaded for C:\PROGRA~1\Baofeng\STORMP~1\Core\Codecs\mfc100u.dll

WARNING: Stack unwind information not available. Following frames may be wrong.

06 190bfce4 786ab327 efffffff efffffff 190bfdc0 verifier+0x230b

*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\PROGRA~1\Baofeng\STORMP~1\Core\Codecs\MP4Splitter.ax -

07 190bfcfc 0c77da1c efffffff efffffff 190bfdc0 mfc100u+0xbb327

08 00000000 00000000 00000000 00000000 00000000 MP4Splitter!DllRegisterServer+0x8aec



0:028> u MP4Splitter!DllRegisterServer+0x8aec L-10

MP4Splitter!DllRegisterServer+0x8adc:

0c77da0c 085e83 or byte ptr [esi-7Dh],bl

0c77da0f c8ff5bc2 enter 5BFFh,0C2h

0c77da13 0400 add al,0

0c77da15 57 push edi;

0c77da16 53 push ebx ;size参数

0c77da17 e8a6980100 call MP4Splitter!DllGetClassObject+0x9a62 (0c7972c2)

ebx为new操作所需的size。在sub_68ADA00中只对ebx进行了下限(是否大于0)检查,而没有进行上限检查导致后面ebx传递到new时发生异常。

默认new不会返回0,而是会抛出异常std::bad_alloc。所以在上面那段程序中,如果size过大,比如7fffffff,则会造成系统抛出异常,而程序没能捕获,造成拒绝服务。

如果适当增加size大小而不超过系统所允许的数值,则在播放过程中会增加内存消耗。

而且在free的过程中可能还是会出现问题的,没有再深入分析了。

没法上传附件,厂商可以自己构造一下验证。我在新版本中还是能够成功的。

修复方案:

程序没有对new失败抛出的exception进行catch。

当前位置:站长啦网站目录 » 站长资讯 » 站长新闻 » 漏洞预警 » 文章详细