4、固件加密基础:对称加密与非对称加密、常见加密算法(AES、DES、RSA、ECC)、加密模式(ECB、CBC、CTR)

做固件逆向这么多年,我见过太多人一上来就盯着二进制文件硬啃。结果呢?遇到加密直接卡死。其实加密没那么玄乎,说白了就是一套数学游戏。你只要搞懂它怎么玩,就能找到绕过去的办法。

今天这一章,咱们把固件加密的底裤扒干净。我会从对称加密讲到非对称加密,再聊聊那些常见的算法和模式。嗯,都是我在实战中反复踩过的坑,你拿笔记好就行。

4.1 对称加密 vs 非对称加密:到底选哪个?

先问个问题:你给朋友寄个保险箱,里面装着你俩的秘密。保险箱本身也得锁上吧?那钥匙怎么给他?

这就是加密的核心矛盾——密钥分发问题

对称加密,就是加密和解密用同一把钥匙。速度快,适合大量数据。但问题来了:钥匙怎么安全地传给对方?我在一个IoT项目里遇到过,厂商直接把AES密钥硬编码在固件里,结果被我用字符串搜索一把揪出来。你说这加密还有啥意义?

非对称加密,则是一对钥匙:公钥加密,私钥解密。公钥随便发,私钥自己藏。安全是安全了,但速度慢得让人抓狂。RSA加密1KB数据,比AES加密1MB还慢。

实战选择建议:

  • 固件内部数据保护:用对称加密(AES-128/256),速度快
  • 固件签名验证:用非对称加密(RSA-2048/ECC-256),防篡改
  • 混合方案:用非对称加密传输对称密钥,再用对称加密加密数据

4.2 常见加密算法:AES、DES、RSA、ECC

咱们一个一个说。这些算法你肯定听过,但真正用对的人不多。

4.2.1 AES(高级加密标准)

这是目前固件加密的绝对主力。128位、192位、256位三种密钥长度。我建议你至少用AES-128,别碰AES-192,那玩意儿在嵌入式平台上性能尴尬。

AES的核心操作是字节代换、行移位、列混淆和轮密钥加。嗯,你不需要背这些细节。你只需要知道:AES的强度在于密钥,不在算法本身。密钥泄露,一切白搭。

我曾经逆向过一个路由器固件,厂商用了AES-256加密。听起来很安全对吧?结果他们把密钥写死在启动脚本里,明文!我连IDA都不用开,直接cat就拿到了。

4.2.2 DES(数据加密标准)

这玩意儿现在就是个活化石。56位密钥,现代GPU几秒钟就能暴力破解。如果你在固件里看到DES,基本可以断定这产品是2000年以前设计的。

不过有个变种叫3DES(Triple DES),用三个密钥做三次加密。安全性还行,但速度慢得离谱。我建议你直接跳过,用AES不香吗?

4.2.3 RSA(Rivest-Shamir-Adleman)

RSA是非对称加密的老大哥。基于大整数分解难题。1024位以下已经不安全了,现在至少2048位起步。

在固件领域,RSA主要用来做签名验证。比如固件升级时,厂商用私钥签名,设备用公钥验签。我见过一个智能门锁,RSA公钥硬编码在Flash里。理论上没问题,但他们的验签代码有个逻辑漏洞——如果签名校验失败,设备会回退到旧版本固件。旧版本固件没有签名校验!你猜怎么着?我直接刷了个旧版本,然后注入恶意代码。

避坑指南:我曾经在分析一个工控设备时,发现RSA公钥虽然硬编码,但验签函数里有个memcmp比较。攻击者可以构造一个特殊的签名,让memcmp在比较到第一个字节时就返回成功。嗯,这就是典型的时序攻击漏洞。

4.2.4 ECC(椭圆曲线密码学)

ECC是后起之秀。同样的安全强度,ECC的密钥长度比RSA短得多。256位ECC ≈ 3072位RSA。这对嵌入式设备来说太重要了——Flash空间和RAM都有限。

ECC在固件中的应用越来越广。比如最新的U-Boot就支持ECC签名验证。我建议你重点关注ECDSA(椭圆曲线数字签名算法)和ECDH(椭圆曲线Diffie-Hellman密钥交换)。

但ECC有个坑:曲线参数。不同厂商用不同曲线,NIST P-256、secp256k1、Curve25519……你逆向时得先识别出曲线类型,否则没法做后续分析。

4.3 加密模式:ECB、CBC、CTR

算法是引擎,模式是变速箱。同样的AES,用不同模式,安全性天差地别。

4.3.1 ECB(电子密码本模式)

最危险的模式,没有之一。每个数据块独立加密。同样的明文块,加密后得到同样的密文块。

你想想看,如果固件里有一段连续的0xFF填充,ECB加密后就会变成一段连续的相同密文。攻击者一眼就能看出数据模式。我在一个摄像头固件里见过,厂商用ECB加密配置数据,结果我直接通过密文模式推断出了配置结构。

一句话总结:ECB只适合加密随机数据(比如密钥本身),千万别用来加密结构化数据。

4.3.2 CBC(密码分组链接模式)

这是最常用的模式。每个明文块先和前一个密文块异或,再加密。解决了ECB的模式泄露问题。

CBC需要初始化向量(IV)。IV必须随机且每次不同。我见过一个厂商,IV写死在代码里,永远是0x0000000000000000。这跟没用IV有啥区别?

另外,CBC有个填充攻击的漏洞。如果固件用CBC模式加密,而且你能够修改密文并观察设备的响应,就可以通过填充预言机攻击(Padding Oracle Attack)逐字节破解明文。嗯,我在一个智能音箱上成功复现过这个攻击。

4.3.3 CTR(计数器模式)

CTR模式把块密码变成了流密码。它用一个递增的计数器生成密钥流,然后和明文异或。

CTR的优点:

  • 可以并行加密/解密,速度快
  • 不需要填充,适合任意长度数据
  • 可以随机访问任意位置的密文

但CTR有个致命弱点:密钥流重用。如果两个数据块用了相同的计数器和密钥,密钥流就一样。这时候把两个密文异或,明文就暴露了。我在分析一个无线传感器网络时,发现所有节点都用同一个密钥和初始计数器。结果我抓了几个包,异或一下,直接读出了传感器数据。

我的经验:逆向固件加密时,先看模式。如果是ECB,恭喜你,工作量减半。如果是CBC,找IV。如果是CTR,找计数器初始值。这些信息通常藏在固件的某个固定偏移处。

4.4 知识体系总览

下面这张图,是我自己整理的固件加密知识框架。你把它存下来,以后分析固件时对着看,思路会清晰很多。

固件加密知识体系 对称加密 AES DES/3DES ECB模式 CBC模式 CTR模式 非对称加密 RSA ECC 签名 密钥交换 哈希函数 SHA-256 MD5 逆向分析要点 1. 识别算法类型:从固件中搜索算法常量(S盒、轮常数等) 2. 定位密钥/IV:通常在固定偏移或通过特定函数初始化 3. 分析模式漏洞:ECB模式泄露、CBC填充攻击、CTR密钥流重用

4.5 实战中的识别技巧

说了这么多理论,来点干货。你在逆向固件时,怎么快速识别加密算法?

  1. 搜常量表:AES的S盒(256字节)、RSA的大素数、ECC的曲线参数。这些在固件里都是特征明显的字节序列。
  2. 看函数调用:如果固件调用了aes_encryptrsa_sign之类的函数名,那基本就明牌了。
  3. 分析数据流:加密后的数据通常是伪随机的,熵值很高。你可以用binwalk的熵分析功能,一眼就能看出哪些区域是加密的。
  4. 找密钥派生:很多固件不会直接存密钥,而是通过KDF(密钥派生函数)从主密钥生成。这时候你得逆向KDF算法。

注意:有些厂商会自定义加密算法,或者对标准算法做微小改动。比如把AES的S盒换掉。这时候标准工具就失效了,你得手动逆向整个算法。嗯,我遇到过两次这种情况,每次都得花一周时间。

好了,这一章的内容就到这儿。加密基础打牢了,后面咱们才能聊怎么绕过它。记住:没有绝对安全的加密,只有没找到的漏洞


专注资料整理