一、 背景情况 从5月17日开始,天线宝贝的GIF表达在每个微信群中流传。在iOS版微信中,只要打开包含此GIF表达式的聊天窗口,就会导致微信闪回。 在具体分析之前,猜测了崩溃的原因:(1)iOS系统的GIF解析功能存在问题; (2)微信自身实现GIF解析的功能,由于输入数据的严格验证而异常。经过测试,我发现iOS版的QQ不受影响,所以我可以排除iOS GIF分辨率。 二、 原因分析 1. 样本精简 最初的GIF样本多达1MB,这不利于定位导致问题的特定数据,因此我们需要简化样本。原始样本GIF由010 Editor打开,GIF模板用于解析,并发生解析异常,这表明样本GIF的格式存在问题。 模板分析表明,经过38帧正常图像数据后,出现了异常数据。因此,如图所示,我们删除了正常的数据部分,只保留了异常数据,然后继续下一步。
可以看出,剩余的异常数据超过100,000个,通过二分法进行测试和排除。具体来说,在删除一半后,测试另一半导致崩溃。如果崩溃,导致异常的数据在预留的一半,反之亦然。
连续消除后,在下图的紫色部分发现异常数据。只要带有GIF的图像数据部分有这些异常数据,就会导致iOS微信闪回。
2. 调试分析 在简化了样本之后,我们发现了导致异常的数据的位置。然后,现在需要结合实际调试来确定实际导致异常的数据。以iOS WeChat 6.5.7为例。发生崩溃时的调用堆栈如下。崩溃发生在微信内部,表明微信自己的GIF解析功能存在问题。
在对相关函数进行逆分析之后,最终确定导致异常的数据。首先,观察sub_100B6CBF0函数,并对GIF中的数据执行循环搜索。如果有0x21和0xF9,则当前数据表示为GraphicControlExtension结构,然后解析GraphicControlExtension数据。
如果当前找到的数据是0x2C,则意味着搜索ImageDescriptor,并跳出while循环以解析实际图像数据。这里也就是异常数据的起始位置!
普通帧数据的ImageDescriptor数据如下:
在导致异常的数据中,有一个0x2C的密钥分隔符,它会将以下红色框中的数据解析为ImageDescriptor。如您所见,ImageWidth属性为0,ImageHeight属性为0x100。
接下来,这部分异常数据将被解析为sub_100B6CE90函数。由于ImageWidth为0,当它乘以ImageHeight时它等于0,在new buffer时,传入的大小参数为0,这是第一个问题,但这不会导致闪回,仍然可以分配一个小堆。
导致崩溃的代码如下。在else块中,没有专门跟踪sub_100B6C4F0的角色。猜测是解压缩lzw并返回解压缩的数据长度v21。由于v10=0x0000010000000000,因此在unsigned int之后将其截断为0,这会导致v10 - 1 - v21为负数。作为memset的第三个参数,相应的unsigned int形式是一个大的正数。在memset时,就会导致崩溃,这是第二个问题。
三、 总结 这个问题的根本原因是WeChat实现了自己的GIF解析功能,但由于输入数据的验证不严格,异常数据被解析并导致崩溃。 5月17日,在GIF开始传播之后,微信似乎在服务器端被屏蔽,使得这个GIF无法正常接收。但是我们可以通过简单地修改GIF中的任何字节来绕过这种阻塞措施。同时,由于需要在iOS应用上审核Apple,需要一定的时间。这使得所有用户无法在修复错误后立即更新。最新的iOS WeChat 6.5.8版本仍然存在崩溃问题。 原作文由乘客安全出版,作者:shrek_wzw@360 Nirvan Team 黑客业务列表介绍和一般分类: 类别:攻击入侵破解开发 1:攻击业务订单:暂时取消所有此类业务订单[仅销售常规IDC流量] 2:入侵业务清单:包括网站源代码,办公系统,黑色系统,教育系统等。 3:破解业务类:软件,加密文件,二次打包,脱壳等。 4:二次开发业务清单:软件二次开发,源代码二次开发等 5:其他业务订单:特洛伊木马[通过所有防病毒],远程控制,特殊软件等 备注:未提及的业务订单可根据主要类别查询或直接联系客户服务。为避免浪费双方时间,请在咨询前阅读:业务交易流程及相关说明 注意:仅接受正式业务,个人无权接受。收集此内容。