逆向工程师如果对设备代码和固件系统进行检测时,发现了许多经过加密处理的固件文件,该怎么办?在本文中我将通过一个真实的故事来教大家如何利用一些基础的计算机知识以及简单的逻辑来应对这一问题。

因为这篇文章主要是要教会大家如何去应对这样的情况,并且给大家提供一个行之有效的解决方案,所以这里我们并不会指明测试所用的调制解调器来自哪家厂商,也不会列出具体文件的真实文件名。

另外这种方法对最新款的调制解调器可能已经不适用了,但在旧版本的调制解调器或者其他生产商所生产的Modem中应该仍可以进行测试。

1. 了解文件结构

首先,我们需要了解该调制解调器固件的文件结构。这款调制解调器中有三个更新版本:

v2.8_image.bin
v3.7_image.bin
v3..4_image.bin

其所有的文件均采用了TLV(Tag-Length-Value) 格式。比如文件v3.7.4_image.bin的结构:

数据值均采用了小端格式 (一种存放二元化资料的格式(所有数字的低位组放在最前面)),其标签(Tag)的长度为16位,数据长度(Length)值为32位。

标签0×7240位于第一个嵌套级中,其数据占满了整个文件。标签0×0003(0x0A字节)位于第二嵌套级中(标签0×7240的数据在其中);接下来的是标签0×0000(0x4BDE0E字节),标签0×0001,以及0×0002(它们并不在上面给出的截图中)。第三层嵌套(含有0×0003的数据)封装了标签0×0002的数据并且存储在长度为四个字节版本号的030704FF的文件中。

其他标签的描述均位于第二嵌套级的其他标签中(0×0000,0×0001,以及0×0002),而他们被单独“打包”存放在一个固定的文件中。即每一个文件都会有一个单独的名称(标签0×0001),标志(标签0×0002),大小(标签0×0003),长度为16字节的值(标签0×0004),以及文件数据(标签0×0005)。

下面是对文件中的所有标签内容进行分析之后所显示出的结果:

如此以来我们便可以对固件的所有组件(CPUImage,AutoInstall,以及WebUI)中的加密数据进行检索获取了。我们发现这三个固件版本中的AutoInstall文件其实是一样的,3.7和v3.7.4版本中的WebUI文件内容也是相同的,但CPUImage文件并不一样。

2、通过算法来进行猜测

标签0×0004位于第三嵌套级中,该标签包含有一个长度为16字节的数据集,且被设置了非常高的熵。它很有可能是一个哈希值,目前最受欢迎的128位哈希算法就是MD5了。

在我们获取到的文件中,很多字节的偏移量数值都是相同的。下图显示的是两个文件的起始部分(不同之处已经进行了高亮显示):

然而如果你试图想要在单个文件中找到相同的数据序列无异于是痴人说梦。

这样看似乎是使用了一个半随机的伽马常数对这些信息进行了处理。RC4算法是目前最为流行的一种加密算法,它刚好可以实现此功能。

3、使用常量密钥对密码流进行破解

如果几条信息使用了相同的密钥来进行加密(例如伽马),对它们进行异或计算就有可能得到它们的部分内容:0字节将会返回明文。

而对AutoInstall文件和WebUI文件分析后我们获得了一个非常有趣的结果:

我们可以看到在该文件中有两个片段:一个 FAT12软盘的镜像和一个CD-ROM的镜像。

4、获取伽马值的数据

在安装驱动或者软件的时候,调制解调器通常倾向于创建一个虚拟光驱来连接,这里就使用了这一概念。

然而当调制解调器与新型的操作系统(例如Windows 7/8,Linux,或者Mac OS X)连接时,虚拟光驱要么就不显示,要么就是显示一两秒钟之后然后消失。因此我们专门找了一台2002年生产的Windows XP笔记本电脑来进行该测试。此时虚拟光驱显示了大约五秒钟,这已经足够我们读取出所有逻辑卷中的数据并获取到镜像。

该文件大小为606,208=0×94000字节,这与AutoInstall文件的大小完全一致。镜像的MD5值为897279F34B7629801D839A3E18DA0345,与标签0×0004的值相同。

现在,我们只需要用AutoInstall文件与这个镜像文件进行异或,就能得到伽马值的数据了。这个伽马值可以用于解密CPUImage和WebUI文件中的加密数据 (大小分别为4,971,976个字节和2,093,056个字节)。

5. 重组一个软盘镜像

如果你能破解这些加密数据,并且使用零字节填充WebUI文件的剩余部分,然后将所有内容编译成一个FAT镜像文件,那么你将能够看到文件系统的整体结构和一些文件的内容。

如果你的调制解调器连接到http:///dir,你将看到相同的文件系统,并能够下载任意文件。

而要恢复WebUI文件,你需要通过与boot,FAT表以及目录描述数据一致的Web接口来下载文件。唯一的困难在于根目录下的 ru文件夹,其内容描述超出了606208字节,因此其内容需要单独恢复。

根据web接口的数据,这个 ru目录必须包含以下文件:

幸运的是,根目录下的eng文件夹具有相同的文件名和创建日期,为了得到正确的ru文件夹,应进行如下改变:

The number of the starting cluster of the current directory

The size of each file

The numbers of the starting clusters of all files

根目录下含有大量的ru目录的集群(0×213)

使用web接口去识别文件大小(分别是3981 = 0xF8D, 5327 = 0x14CF, 以及3328 = 0xD00 )

最开始的集群是很容易猜到的。根据boot数据来看,每一个集群占据了四个分区或者2048字节。ru目录仅要求一个集群,Manualupdate.html 和 Network.html-两个集群Index.html-三个集群。由于集群会被按照顺序写在一个空的磁盘中,文件将会分别从 0×214, 0×216以及 0×219开始。ru目录恢复的数据如下所示:

包含刻录磁盘镜像的ru folder 和所有文件内容,并且还有一个明文的WebUI 文件,从固件头文件我们得到其MD5 是48D1C3194E45472D28ABFBEB6BBF1CC6 。

至此,我们已经破解了AutoInstall文件和WebUI文件,并且还得到了 2,093,056字节的伽马值数据。

6. 校验CPUImage文件

自然而然地,当我们破解了CPUImage文件的前2MB数据之后,我们就可以进行反汇编了。在对处理器的指令系统(ARM 小端)和下载基址(第一个0 x34c字节必须跳过)以及找到更新解密位置进行了解之后,我们获得了下列代码:

如上所示,其中加密密钥位于0x2ADC60,长度为0×15 个字节并被RC4 算法加载。但是0x2ADC60=2,808,928,所以这个密钥已经超出了我们所知的伽马值了。

在更早的固件版本(v3.7和v2.8)中,这个密钥也超出了其解密域(分别为0x2AD70C和0x2A852C)。

7、再一次进行异或运算

如果对3.7版本和3.7.4版本的CPUImage文件进行异或计算,我们将会得到位于0x34C + 0x2AD70C = 0x2ADA58的字符串“SungKook ”James” Shin”。这是一个RC4密钥,被用于对所有更新文件进行加密。

现在,我们只需要确认这个RC4密钥能与我们之前所获取的伽马值相匹配,并且CPUImage的MD5值能与固件系统的文件header相匹配。

到这里,我们可以对固件本身进行测试了,而这将是一个完全不同的故事。

*参考来源:ptsecurity

使用Dmitry Sklyarov的方法来破解一款流行的4G调制解调器的更多相关文章

  1. 【原创】Linux下使用SecureCRT的方法:破解&编码

    1.下载SecureCRT软件 ubuntu64位:http://download.csdn.net/detail/cobps/7941145 ubuntu32位:http://download.cs ...

  2. Pycharm2018的激活方法或破解方法(必须加host)

    修改hosts文件将0.0.0.0 account.jetbrains.com添加到hosts文件最后,注意hosts文件无后缀,如果遇到无法修改或权限问题,可以采用覆盖的方法去替换hosts文件 修 ...

  3. Pycharm2018的激活方法或破解方法

    1.授权服务器激活 优点:方便快捷 缺点:激活的人数多了就容易被封杀,所以可能经常需要去激活 选择License server激活,然后填入: idea.qmanga.com或http://xidea ...

  4. Loadrunner11的安装方法和破解

    前提:我使用的是在虚拟机下安装32位win7系统,浏览器为IE8(为录制脚本做铺垫) LoadRunner,是一种预测系统行为和性能的负载测试工具.通过以模拟上千万用户实施并发负载及实时性能监测的方式 ...

  5. DevExpress的安装方法与破解教程【转】

    DevExpress是一个界面控件套件,提供了一系列的界面控件套件的DotNet界面控件.DevExpress开发的控件有很强的实力,不仅功能丰富,应用简单,而且界面华丽,更可方便订制,对于编程人员来 ...

  6. IntelliJ IDEA 2017 完美注册方法及破解方法

    本文使用破解方式注册. 下载破解文件JetbrainsCrack-2.6.2.jar 下载地址: http://idea.lanyus.com/ 开始破解 一.将下载的 JetbrainsCrack- ...

  7. Myeclipse Professional 2014使用软件获取激活码的方法(声明:破解仅仅是为个人使用Myeclipse,不作为商业获利.商业活动请购买正版软件)

    一下说明全部为网络来源,已经忘了原地址了,一直保留的是获取激活码用的软件和说明, 原著看见可联系(非常谢谢原作者): 获取激活码用的软件下载地址(个人百度云):http://pan.baidu.com ...

  8. IntelliJ IDEA2017 激活方法 最新的激活注册方式方法,破解,密钥

    IntelliJ IDEA2017 激活方法(亲测可用): 搭建自己的授权服务器,对大佬来说也很简单,我作为菜鸟就不说了,网上有教程. 我主要说第二种,现在,直接写入注册码,是不能成功激活的(如果你成 ...

  9. 方法二破解:Excel工作表保护密码

    最简单,复制整表,粘贴在全新的表中.但是有时候会丢失一些元素 在excel2016中实测验证过有效 第1步:在工作表菜单栏上添加[开发工具].方法是:依次单击[文件]--->[选项]---> ...

随机推荐

  1. robotframework笔记23

    远程库接口 远程库接口提供了对在测试库 比机器人框架本身是在不同的机器上运行, 同时实现图书馆使用其他语言比 本机支持Python和Java. 为一个测试库用户远程 library看起来几乎一样的其他 ...

  2. 20150206读书笔记<深入理解计算机系统>

    ●第一章 C是系统级编程的首选.C++显示支持抽象,属于应用级程序设计语言. 简单例子: 一个典型系统的硬件组成: 存储器的层次结构: 注:存储器层次结构的设计思想是,该层存储器作为下一层存储器的高速 ...

  3. iOS开发之——从零开始完成页面切换形变动画

    前言 某天我接到了UI发给我的两张图: 需求图.png 看到图的时候我一脸懵逼,显然我需要做一个页面切换的指示动画.老实说,从大三暑假开始做iOS开发也一年有余了,但是遇到复杂动画总是唯恐避之不及,只 ...

  4. 使用TypeScript开发程序

    简介 TypeScript一直发展不错,我们公司在开发新功能时,考虑到程序的可维护性,使用了TypeScript编写浏览器上的程序,我们是从零开始使用TypeScript,甚至我连javascript ...

  5. 【转载】Gambit使用教程

    第一章 Gambit使用 Gambit介绍 网格的划分使用Gambit软件,首先要启动Gambit,在Dos下输入Gambit <filemane>,文件名如果已经存在,要加上参数-old ...

  6. DIV使用tabindex获得事件详解 移动div

    添加 tabindex='-1' 属性: 默认:获取不到焦点事件(blur) 1 <div class="wl-product" id="wl-product&qu ...

  7. lucene底层数据结构——FST,针对field使用列存储,delta encode压缩doc ids数组,LZ4压缩算法

    参考: http://www.slideshare.net/lucenerevolution/what-is-inaluceneagrandfinal http://www.slideshare.ne ...

  8. 平衡查找树之B树

    转自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 定义 B 树可以看作是对2-3查找树的一种扩展,即 ...

  9. linux 一些命令

    1.查看cpu个数 cat /proc/cpuinfo |grep "physical id" |sort | uniq |wc -l 2 2.查看cpu逻辑个数 cat /pro ...

  10. spring mvc与mybatis收集到博客

    mybaits-spring 官方教程 http://mybatis.github.io/spring/zh/ SpringMVC 基础教程 框架分析 http://blog.csdn.net/swi ...