欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Ogg音频格式文件的样本构造(CVE-2018-5146)

来源:本站整理 作者:佚名 时间:2019-08-17 TAG: 我要投稿

下面的所有分析都是在Firefox 59.0 32位上进行的。由于笔者是刚入门的小白,水平有限,文章有错误或者写法不当的地方,请各位师傅斧正。
一.概述
这是一个firefox的漏洞,位于libvorbis库中,在音频合成过程的深层次位置,想要触发它只能由具有residue 1结构的音频文件。
Vorbis是一种音频压缩格式,它的相关数据会被封装到一个OGG文件中;OGG则是一种多媒体文件格式。
下图是用010Editor中的ogg.bt模板读取出来的。可以看到这个ogg文件有3个页。后面的分析,都将使用这个下图这个文件,姑且取名为TestOgg;下面的分析过程都是建立在一个正常的ogg样本之上的,这里就是TestOgg。

(更详细的ogg vorbis格式将在下面介绍)
二.环境搭建
系统:Windows7 32位
工具:Visualstudio 2013,一个正常的ogg vorbis音频文件。
因为需要使用到OggVorbis音频文件,而这个文件的格式又比较陌生。那么就需要一个能够帮助我们解析这个文件的工具。去官网发现有一些打包好的工程,和一些编译好的EXE文件。

这个名叫ogginfo .exe的文件就可以静态解析Ogg Vorbis文件

然后下载这些工程,在本地自行配置环境,编译一下ogginfo,成功之后就可以打断点进行调试一步一步分析了。

当然,这个编译过程可能不会成功,会报错,想要解决也行,这里我直接写下我最后成功的操作:
0.官网下载libogg-1.3.3,libvorbis-1.3.5,然后从某hub上下载的vorbis-tools-master。因为从官网下载的这个tools工程有问题,而且没有解决掉。
1.把libogg-1.3.3的include / ogg文件夹,和libvorbis-1.3.5下include / vorbis文件夹放到tools的include下面。
2.编译 libogg_static,出现下面问题,如下解决一下就行。

3.编译vorbis_static,先把libogg-1.3.3的include / ogg文件夹放到include下。成功后得到libvorbis_static.lib,改名为libvorbis.lib即可。
4.然后打开tools工程,把刚刚编译好的libogg_static.lib,libvorbis.lib的路径添加进去。

编译一下ogginfo,成功。

5. 将ogginfo设置为Startup Project,然后给它随便一个ogg文件作为参数就可以进行调试,我使用的TestOgg只有3个ogg页。

6.调试中比较关键的一个函数就是:oggpack_read

按F11跟进这个函数的时候就会提示你选择一个framing.c文件,选择如下这个src目录就行。
那么在解析vorbis的时候关键的函数是:vorbis_synthesis_headerin:

这里会先解析pack的类型,然后按类型来一一解析其中的数据,下面构造poc的时候会详细说明这些结构。
到此静态分析的环境搭建完成了;下面的源码分析和调试都是在这个环境搭建完成的基础上进行的,但是主要目的是帮助构造poc。
三.漏洞函数的分析
漏洞的具体位置在vorbis_book_decodev_add()这个函数中,在工程中的具体位置如下:

源码如下:

问题出在高亮部分那段for循环。这个for循环的条件是j dim,里面的操作是把t数组赋给a数组;而a数组的下标则是i,在上一个for循环可以看到i dim的值大于n时,t数组对a数组的赋值就会超过a数组的正常范围。a数组就在此时越界。
那么,a数组是什么,t数组又是什么?
从图上可以看到a数组是作为一个参数被传递进来的,而t数组是则是通过计算得来的
3.1 a数组
那么这里尝试寻找a数组,看看是从哪里来。
在源码中搜索漏洞函数名字,找到如下的调用,这个叫_01inverse的函数是漏洞函数的上一层。

[1] [2] [3] [4]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载