作为一名逆向工程师,当你在对设备代码和固件系统进行检测时,却只发现了一大堆经过加密处理的固件文件,这时你该怎么办?接下来,我准备给大家讲述一个真实的故事,并会教大家如何利用计算机的基础知识和简单的处理逻辑来应对这种情况。
在这篇文章中,我们并没有指明测试所用的Modem(调制解调器)厂商名称,也没有列出具体文件的真实文件名。因为这篇文章主要是要教会大家如何去应对这样的情况,并且给大家提供一个行之有效的解决方案。这种方法可能已经无法适用于最新款的调制解调器了,但是我们也许可以在旧版本的调制解调器中,或者其他生产商所生产的Modem中测试这种方法。
1. 确定文件结构
首先,我们需要确定调制解调器固件的文件结构。在这款调制解调器中,有三个更新版本:
l v2.8_image.bin
l v3.7_image.bin
l v3.7.4_image.bin
其中,所有的文件均采用了TLV格式(一种由(Type,Length,Value)三元组所构成的可变格式)。比如说,文件v3.7.4_image.bin的结构应该如下图所示:
所有的数据值均采用了小端格式,标签(Tag)的长度为16位,数据长度(Length)值为32位。
标签0x7240位于第一层嵌套中,其数据域占满了整个文件。标签0x0003(0x0A字节)位于第二层嵌套中(这段数据位于标签0x7240的数据中满,即嵌套关系);接下来的就是标签0x0000(0x4BDE0E字节),标签0x0001,以及0x0002(这些数据并不在上面给出的这张截图中)。第三层嵌套包含有标签0x0002和0x0003的数据,并且还存储有030704FF文件的版本号(其长度为四个字节)。
固件文件中还有很多单独封装的文件,而这些文件的描述信息均存储在位于第二层嵌套的其他标签中(0x0000,0x0001,以及0x0002)。
其中,每一个文件都会有一个单独的名称(标签0x0001),单独的标志(标签0x0002),大小值(标签0x0003),长度为16字节的值(标签0x0004),以及文件数据(标签0x0005)。
我们对文件中所有的标签的内容进行了解析处理,下图所显示的就是我们的处理结果:
这样一来,我们就可以从固件文件的所有组件(CPUImage,AutoInstall,以及WebUI)中提取出加密数据了。在我分析之后发现,这三个固件版本中的AutoInstall文件其实是一样的,v3.7和v3.7.4中的WebUI文件内容也是相同的。但是这三个固件版本中的CPUImage文件却都不一样。
2. 推测加密算法
标签0x0004位于第三层嵌套中,该标签包含有一个长度为16字节的数据集,而且该数据经过了非常复杂的加密处理。它很有可能是一个哈希值,而目前最为常见的128位哈希算法就是MD5了。
在我们获取到的加密文件中,很多偏移量的字节数据值都是相同的。下图显示的是两个文件的起始数据(不同的地方已经通过高亮效果标出):
但是,如果你试图想要在同一个文件中找到相同的数据序列的话,你会发现这是不可能的。
从表面上看,开发人员似乎曾使用了一个半随机的伽马常数来对这些信息进行过处理。RC4算法是目前最为流行的一种加密算法,而它可以实现这样的功能。
3. 使用常量密钥来破解流密码
如果系统仅使用一个密钥来加密文件中的多条数据(例如上文提到的伽马值),我们就可以对这些数据进行异或计算来得到它们的部分内容:0字节将会返回明文数据。
我们在对AutoInstall文件和WebUI文件进行了分析之后,得到了以下有趣的结果:
我们可以从这两个数据段中看到,其中有一个文件为FAT12软盘的映像文件,而另一个则是虚拟光驱的映像文件。
4. 获取伽马值的数据
在调制解调器安装驱动或者软件的时候,设备会挂载一个虚拟CD-ROM(即虚拟光驱),并与其进行连接,这一机制与很多现代Modem设备是一样的。
但是,当调制解调器与新型的操作系统(例如Windows 7/8,Linux,或者Mac OS X)连接时,调制解调器所加载的虚拟光驱要么就是根本不显示,要么就是显示一两秒钟之后就消失了。为了对这一问题进行测试,我们专门找到了一台2002年生产的Windows XP笔记本电脑。与之前的情况差不多,虚拟光驱出现了大约五秒钟就消失了,但是也足够我们读取出所有逻辑卷中的数据并获取到对应的映像文件。这个文件大小为606,208,即0x94000字节,对应的正是AutoInstall文件的大小。映像文件的MD5值为897279F34B7629801D839A3E18DA0345,这个值与标签0x0004的值相同。
现在,我们只需要用AutoInstall文件与这个虚拟光驱映像文件进行异或计算,就可以获取到伽马值的数据了。这个伽马值可以用于解密CPUImage和WebUI文件中的加密数据(数据大小分别为4,971,976个字节和2,093,056个字节)。
5. 重组软盘映像文件
如果你能破解这些加密数据,并且使用零字节填充WebUI文件的剩余部分,然后将所有内容编译成一个FAT映像文件,那么你将能够看到文件系统的整体结构和某些文件的内容,具体信息如下图所示:
如果你的调制解调器能够与网页浏览器进行连接,那么你可以将地址“http:///dir”输入至浏览器中,你将会看到如上图所示的文件系统,而且你也可以下载这些文件。
为了恢复WebUI文件,你必须通过web页面下载相应的文件,并进行替换操作。
根据Web接口所提供的数据,ru目录必须包含下列文件:
在我们对上述结果进行了进一步的分析之后,我们成功地破解了AutoInstall文件和WebUI文件,并且还得到了伽马值的相关数据。这一过程中的具体操作步骤请查看原文获取。
6. 检测CPUImage文件
当我们成功解密了CPUImage文件的前2MB数据之后,我们就可以打开反汇编工具了。在对处理器的指令系统和下载基址等数据进行了分析之后,我们得到了下列代码:
从上图中我们可以看到,其中加密密钥的长度为0x2ADC60个字节,但是0x2ADC60=2,808,928,所以这个密钥长度已经超出了我们之前所找到的伽马值了。
在早期版本(v3.7和v2.8)的固件中,这个加密密钥的长度同样也超出了相关数据域(长度分别为0x2AD70C和0x2A852C)。
7. 异或
如果拿固件v3.7和v3.7.4的CPUImage文件进行异或计算,我们将会得到类似“SungKook "James" Shin”的字符串,地址为0x34C + 0x2AD70C = 0x2ADA58。这是一个RC4密钥,系统利用这个密钥来对整个文件系统进行了加密。
现在,我们最后的一件事情就是确保这个RC4密钥能与我们之前所获取的伽马值相匹配,并且CPUImage的MD5值能与固件系统的文件header相匹配。
经过上述这一系列操作之后,我们就可以对固件进行更加深入的测试了,但是从这里开始,情况又会变的大不一样了。
本文由 360安全播报 翻译,转载请注明“转自360安全播报”,并附上链接。
原文链接:http://blog.ptsecurity.com/2016/02/decipher-updates-of-popular-4g-modem.html