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单元头即可。
如果对这个有兴趣的话,可以参考一下这本书: