XVID整数下溢问题分析

先埋坑,旧的那些IE的坑填完了再写这篇好了。

漏洞作者:blast
来源:http://nul.pw/

0:012> g
(2e40.2d4c): Access violation - code c0000005 (!!! second chance !!!)
*** ERROR: Symbol file could not be found. Defaulted to export symbols for F:\Windows\system32\xvidcore.dll -


xvid是一种规范的编码格式,它属于mpeg4 part 2规范。那开源的xvid解析器在解析所有的mp4时都是正确的吗?显然不是,看看这一个例子吧。

xvidcore在解析一个畸形的mp4文件时,处理vop可能发生整数下溢。vop可以极为简化的理解为帧,当然两者还是有区别的。一个vop的结构看起来像是:

vop_start_code (32 bits - 0x000001B6)
vop_coding_type (2 bits - 0=I, 1=P, 2=B, 3=S)
modulo_time_base (length varies)
marker_bit (1 bit - always 1)
vop_time_increment (length varies)
marker_bit (1 bit - always 1)
vop_coded (1 bit - 0 for NVOPs, 1 otherwise)

0x000001b6 是mpeg4 , part 2 规定的startcode。

在AVS流中,start code是一个特殊的bit形式,每组start code都有start code prefix和start code value。start code prefix是由23个0位和1个1位组成,也即0x00 00 01。所有的start code都是按字节对齐的。

0x000001b6是pb_picture_start_code,这代表了一个P图或者B图的开始。前导帧间预测(P图)和双向帧间预测(B图)由一个2位无符号字符表示,01==P图,02==B图。

一个NAL单元结构如下:

1bit     2bits           5bits            payload information
|-----|----------|-------------------|-----------------
  FZB     NRI                NUT             RBSP
^---------------header---------------^

forbidden-zero-bit
NAL-ref-ide
NAL-unit-type

NAL是网络抽象层的缩写,这个东西主要是为了向网络友好的环境传输数据用的。要把AVS视频流映射成NAL单元,只要把每个0x000001的数据映射到NAL单元中,然后在start code之前增加一个1字节的NAL单元头即可。

如果对这个有兴趣的话,可以参考一下这本书:

http://books.google.com.hk/books?id=6wfGBAAAQBAJ&pg=PA71&lpg=PA71&dq=0x000001b6&source=bl&ots=ZKA_0DM5aF&sig=WJo619-gGY188gxxDUKaX4z0HJI&hl=zh-CN&sa=X&ei=kUpsVO6wFISlmQXl5oDoDw&ved=0CDMQ6AEwAzgK#v=onepage&q=0x000001b6&f=false

标签:none

添加新评论

captcha
请输入验证码