四个字节的安全 :一次固件加密算法的逆向分析

作者:马卓

导语 本研究由hyperchemma和saltzhou共同完成。这篇文章源自我们的一个检测项目,项目中我们需要对设备的固件进行分析,在整个固件分析的过程中我们克服了很多困难,最后完整解密了设备固件的内容,这里将相关的内容做个记录。

设备介绍

设备采用ATMEL SAMA5D2系列的SOC作为主控芯片。该芯片基于ARM Cortex-A5内核,支持SPI、I2C等总线。支持USB外部设备。同时该芯片内置基于硬件的算法加速器,支持SHA1、SHA256等哈希算法,支持AES,3DES等对称加密算法。

获取固件

设备主板如下。通过观察主板,我们并没有在主板上发现常见的UART,JTAG等调试接口,这使得我们无法动态观察设备固件的运行方式。随后我们发现设备组主板上发现一个flash芯片,型号是N25Q032A,这个flash的大小是4MB。通过阅读主控芯片的手册,我们发现,这个款芯片内部容量有限,多采用外置flash的方式存储代码,因此我们推测这个flash中应该包含设备的主要代码,接着我们使用编程器我们完整读取了flash芯片的内容。

分析固件

获得设备固件后,我们着手开始对固件文件进行分析。初步观察发现,flash固件大致分为几个区域:

0x000000-0x020000 这个部分是设备的启动的代码
0x020000-0x070000 第一个加密块
0x070000-0x200000 第二个加密块
0x200000-0x400000 配置数据保存快

Flash中一共有两个加密的区域,推测这两个区域应该是整个固件的真正的代码,硬件厂商为了保护代码而对这部分代码进行了加密。下面就来探讨一下如何解密这两块加密的代码。

每个加密块的结构如下,其中有两个字段比较关键,一个是加密块的大小和加密后的数据。

typedef struct _encryptblock{
DWORD MAGIC; //0xf4f3f2f1
BYTE dummy[8]; //0xCD
int Size;
BYTE encryptedData[0]; //encrypted data
} encryptblock;

加密块的结构中不存在密钥字段,因此我们需要弄清楚这部分数据是什么算法加密的,以及密钥在哪里。Flash的开头部分包含部分代码,这部分代码是设备的启动代码,从逻辑上应该存在这部分加密块的解密算法和密钥,因此我们尝试对这部分代码进行逆向分析。

设备启动代码是设备启动阶段执行的代码,这部分代码通常不具备文件格式,代码也是在一个预先设定好的绝对物理地址上执行的。因此在对这部分代码进行逆向分析之前,首先我们需要确定这部分代码的基址,通过阅读芯片手册和对代码进行检查,我们确定这部分代码执行的基址是0x200000。加载到IDA中,我们在入口看到了这样的代码:

入口处有几个跳转指令,第一条是跳转到启动代码的真实入口,其他是跳转是跳转到相应的中断处理函数上。

通过定位特征数据和跟踪代码执行流,我们定位到了解密函数,下面就这部分代码的流程进行分析:

首先程序会读取第一个加密块的头部四个字节,比较是否是0xF4F3F2F1,检查合法性。然后程序会读取加密块的大小,并检查大小是否大于0x30000,同时检查数据块大小是否是0x40的倍数。

经过上面的检查后,程序会加密的内容以0x40大小为单位复制到绝对地址0x20800000。

经过上面的操作后,程序会将加密的数据分成两部分,分别用两个密钥:key1和key2,使用AES算法进行解密。解密到物理地址0x23F00000。至此,解密过程就算完成了。但是对于解密算法的相关的细节我们还没完全弄清楚。下面我们来逐一对解密的细节进行分析。

首先我们先看看是如何确定加密算法的。通过逆向分析,我们发现程序调用了下面这样一段代码:

从代码上看,0xF002C000这个地址已经超过当前固件的地址范围了,那这个操作的含义是什么呢? 通过查找芯片手册 ,我们这个地址其实是芯片内部的寄存器,名称为AES_Control Register.

上面代码的含义就是重置AES硬件加密引擎。

在知道了加密算法是AES,我们需要确定该算法的两个要素,一个是初始化向量(IV),一个是密钥。我们先看看IV是从哪里来的。

通过分析,我们发现IV被保存在0x00209FA4这个地址。而对这个地址的赋值代码如下:

上面代码告诉我们,IV的长度是16字节,分成四个部分,分别保存在R1,R2,R3和R12中, IV="\x00\x10\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x20\x00\x00\x00"。

最后我们来分析一下解密密钥的来源。解密过程中共需要两个密钥key1和key2。这两个密钥来自同一个来源,因此我们这里对key1的来源着重进行分析。

生成密钥的时候首先调用了下面的函数:

函数中的0xF8030050同样是一个芯片内部寄存器,这个地址和0xF803004C分别保存了4个字节芯片序列号,共计8个字节,这8个字节的序列号是唯一的,对每个芯片都不一样。这个函数就是获取当前芯片的序列号,这里我们把得到的数据记作SN0+SN1。

在读取到芯片序列号后,程序会调用一个函数生成32字节的key1,然后再对序列号进行换位,再次用同样的函数生成32字节的key2。那么这个函数到底是什么怎样把序列号计算成密钥的呢? 经过初步分析,我们在函数中发现了SHA256算法中使用的到常量,但是这个函数的代码并未采用标准库的代码,因此确定这个函数是否是标准的SHA256算法需要对代码进行详细的比对,这个过程会很耗时,因此我们想到了另一种方法来验证代码是否为标准SHA256。

我们可以肯定这部分代码是个纯算法的代码 ,因此不涉及到任何与硬件交互和操作的代码。因此我们将这段代码在模拟执行环境中执行并检查结果,如果得到的结果与我们使用标准算法计算的结果一致则表明这段代码就是标准的SHA256算法。

我们选择的模拟执行环境是Unicorn,一个基于qemu修改的CPU模拟器,支持各种语言的开发,下面是我们用python编写的模拟执行的代码。

通过上面代码的输出结果,我们确定了上面的算法输出的结果与标准SHA256算法一致。

至此,我们就分析清楚了固件的解密算法以及密钥来源,但是还有一个遗留的问题,就是如何的获取生成密钥芯片序列号。

前面提到,芯片序列号是唯一的,我们无法使用一个设备的密钥解密另一个设备的固件。因此我们需要的获得当前设备主控芯片的序列号。

由于设备不存在可用的输出接口,因此我们能想到的唯一能获取芯片序列号的方法就是patch固件,同时我们还需要将获取到序列号输出到能够放访问到的地方,这里我们采用了写flash的方法。下面是我们写的对固件的patch代码。

我们将修改过的固件烧入flash中,并重新焊接回去,在设备上电执行一段时间以后,再取下flash,读取其中的内容,这样我们就获得了当前芯片的序列号。

获取序列号以后,我们就可以按照之前的分析的算法对固件内容进行解密了。

最后我们还遗留一个问题,就是如何解密其他设备的固件。其实这个问题很好解决,因为芯片生产厂商在为每个芯片设置序列号时并不是采用全随机的方式,序列号之间存在一定联系和规律,因此我们可以假设序列号中的前面四个字节是固定的,而后面四个字节是不同的,然后暴力穷举这四个字节的内容。实践中我们使用这个方法成功解密了另外两台设备的固件。

结论

在本文中我们逆向了一款设备固件的加密算法,同时采用了模拟执行的方式确认了固件中的算法。最后我们发现整个设备固件的安全体系只依赖于四个字节的数据,在了解了相关的算法后,这种加密保护方式很容易被攻破。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

走进科学:对七夕“超级病毒”XX神器的逆向分析

首先给各位无良媒体记者跪了。七夕那天刚从公司拿到样本的时候还以为是主管随便到网上扒了个木马demo给我练手,第二天看新闻才知道这小玩具已经搞得满城风雨,媒体竟然...

20350
来自专栏FreeBuf

关于8月31日维基解密被攻击的观察与分析

十几天前,维基解密遭受了一次攻击,导致很多访问者看到了“OurMine”的声明,他们声称已经获取了维基解密服务器的控制权。这次攻击之后,很多人(包括维基解密的粉...

26750
来自专栏FreeBuf

黑产是如何强刷用户银行卡8.1万元的?

故事梗概 今年端午节特意动用带薪年假,在家本着远离黑客,远离江湖,舒舒服服和家人享受几天假期,谁知却早已深陷江湖。 6月11日中午叔叔找上门,说自己的银行卡莫名...

27760
来自专栏FreeBuf

远控盗号木马伪装成850Game作恶

前言 近期,360QVM团队捕获到一类在网上广泛传播的远控盗号木马,该木马伪装为正规棋牌游戏850Game的安装程序,在伪造的钓鱼网站(如:www.gam850...

25550
来自专栏黑白安全

本地巧暴MD5

现在MD5加密的应用范围可谓是极其广泛,绝大部分的网站存储账号密码的数据库都采用的是MD5加密方式,只有极少数的是明文密码——毕竟多一层加密就多一层安全。标准的...

35230
来自专栏FreeBuf

黑了记者:写个恶意软件玩玩(二)

该篇是3篇系列中的第2篇(可在此读第1篇 http://www.freebuf.com/articles/others-articles/34277.html)...

21190
来自专栏FreeBuf

防范数据窃取从了解其手法做起

数据窃取是针对组织攻击链中的最后一个阶段。攻击者窃取数据的技术可谓花样百出,网上也有大量关于数据窃取方面的技术文档以及工具。本文的目的就是尽可能的将这些技术整合...

7730
来自专栏FreeBuf

Kali Linux中前十名的Wifi攻击工具

无线网络的攻与防一直是比较热门的话题,由于无线信号可以被一定范围内的任何人接收到(包括死黑阔),这样就给WIFI带来了安全隐患;路由器生产厂商和网络服务供应商(...

384100
来自专栏Vamei实验室

协议森林01 邮差与邮局 (网络协议概观)

信号的传输总要符合一定的协议(protocol)。比如说长城上放狼烟,是因为人们已经预先设定好狼烟这个物理信号代表了“敌人入侵”这一抽象信号。这样一个“狼烟=敌...

207100
来自专栏FreeBuf

敞开的地狱之门:Kerberos协议的滥用

作者 Rabbit_Run 微软的活动目录默认使用Kerberos处理认证请求。在BlackHat 2014上神器Mimikatz的作者剖析了微软实现的Kerb...

57190

扫码关注云+社区

领取腾讯云代金券