使用Dmitry Sklyarov的方法来破解一款流行的4G调制解调器
逆向工程师如果对设备代码和固件系统进行检测时,发现了许多经过加密处理的固件文件,该怎么办?在本文中我将通过一个真实的故事来教大家如何利用一些基础的计算机知识以及简单的逻辑来应对这一问题。
因为这篇文章主要是要教会大家如何去应对这样的情况,并且给大家提供一个行之有效的解决方案,所以这里我们并不会指明测试所用的调制解调器来自哪家厂商,也不会列出具体文件的真实文件名。
另外这种方法对最新款的调制解调器可能已经不适用了,但在旧版本的调制解调器或者其他生产商所生产的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调制解调器的更多相关文章
- 【原创】Linux下使用SecureCRT的方法:破解&编码
1.下载SecureCRT软件 ubuntu64位:http://download.csdn.net/detail/cobps/7941145 ubuntu32位:http://download.cs ...
- Pycharm2018的激活方法或破解方法(必须加host)
修改hosts文件将0.0.0.0 account.jetbrains.com添加到hosts文件最后,注意hosts文件无后缀,如果遇到无法修改或权限问题,可以采用覆盖的方法去替换hosts文件 修 ...
- Pycharm2018的激活方法或破解方法
1.授权服务器激活 优点:方便快捷 缺点:激活的人数多了就容易被封杀,所以可能经常需要去激活 选择License server激活,然后填入: idea.qmanga.com或http://xidea ...
- Loadrunner11的安装方法和破解
前提:我使用的是在虚拟机下安装32位win7系统,浏览器为IE8(为录制脚本做铺垫) LoadRunner,是一种预测系统行为和性能的负载测试工具.通过以模拟上千万用户实施并发负载及实时性能监测的方式 ...
- DevExpress的安装方法与破解教程【转】
DevExpress是一个界面控件套件,提供了一系列的界面控件套件的DotNet界面控件.DevExpress开发的控件有很强的实力,不仅功能丰富,应用简单,而且界面华丽,更可方便订制,对于编程人员来 ...
- IntelliJ IDEA 2017 完美注册方法及破解方法
本文使用破解方式注册. 下载破解文件JetbrainsCrack-2.6.2.jar 下载地址: http://idea.lanyus.com/ 开始破解 一.将下载的 JetbrainsCrack- ...
- Myeclipse Professional 2014使用软件获取激活码的方法(声明:破解仅仅是为个人使用Myeclipse,不作为商业获利.商业活动请购买正版软件)
一下说明全部为网络来源,已经忘了原地址了,一直保留的是获取激活码用的软件和说明, 原著看见可联系(非常谢谢原作者): 获取激活码用的软件下载地址(个人百度云):http://pan.baidu.com ...
- IntelliJ IDEA2017 激活方法 最新的激活注册方式方法,破解,密钥
IntelliJ IDEA2017 激活方法(亲测可用): 搭建自己的授权服务器,对大佬来说也很简单,我作为菜鸟就不说了,网上有教程. 我主要说第二种,现在,直接写入注册码,是不能成功激活的(如果你成 ...
- 方法二破解:Excel工作表保护密码
最简单,复制整表,粘贴在全新的表中.但是有时候会丢失一些元素 在excel2016中实测验证过有效 第1步:在工作表菜单栏上添加[开发工具].方法是:依次单击[文件]--->[选项]---> ...
随机推荐
- 项目文件包含 ToolsVersion="12.0" 设置,但此工具集未知或缺失。
项目属性(Alt+F7),再点常规,常规中有个平台工作集,把V120改成V110或者v100,然后就能正常运行了.
- 你不知道的JavaScript--面向对象高级程序设计
转载http://blog.csdn.net/i10630226/article/details/51088841 1. JS是基于原型的程序 建立一个简单的面向对象的类.有属性,有方法. funct ...
- SQL Server数据库(SQL Sever语言 函数以及SQL编程)
1.数学函数:操作一个数据,返回一个结果 --去上限: ceiling ☆select ceiling(price) from car --去下限:floor ☆select floor(price) ...
- AngularJS开发经验(转)
AngularJS是为了克服HTML在构建应用上的不足而设计的.HTML是一门很好的为静态文本展示设计的声明式语言,但要构建WEB应用的话它就显得乏力了.所以我做了一些工作(你也可以觉得是小花招)来让 ...
- PHP的那些坑
1.urlencode urlencode编码的对象必须是utf-8编码.如果是其它格式的编码就会出现乱码. 2.array_merge 一般来说,array_merge就是把两个或两个以上的数组组合 ...
- PHP 页面编码声明方法详解(header或meta)
php的header来定义一个php页面为utf编码或GBK编码 php页面为utf编码 header("Content-type: text/html; charset=utf-8&quo ...
- php solr 扩展
安装php的solr扩展 下载地址: http://pecl.php.net/get/solr windows下载地址: http://downloads.php.net/pierre/php_sol ...
- 通过计算机名访问linux
1.安装samba 2.设置/etc/samba/smb.conf的 netbois name 配置节的值为你要设置的名称,如 netbois name = mylinux 也可以不设置此项,如果不设 ...
- GUID vs INT Debate【转】
http://blogs.msdn.com/b/sqlserverfaq/archive/2010/05/27/guid-vs-int-debate.aspx I recently read a bl ...
- jQuery的bind()与live()
前言 最近一个项目的前端有这样的一个需求:页面中有某按钮,点击按钮之后通过服务器的返回信息更改这个按钮的点击事件执行函数. 方案1 之前小猪使用的方法是给按钮增加class.在jquery中通过cla ...