Flash Dump 技术解析
一、Flash Dump 技术概述
固件指嵌入在硬件设备中的软件,固件分析是分析 IoT 设备软件层面安全性的主要手段。随着物联网安全得到重视,越来越多的厂商选择发布加密的固件升级包。这种改变让安全研究者也越来越难以从升级包中直接提取固件。安全研究者们因此将目光转向设备本身,尝试从设备中直接提取固件。
从设备中提取固件的方式有很多,比如找到串口,通过 uboot 命令 dump 固件,甚至直接通过硬件调试口读取固件。但这些基于串口、基于调试的方法都不具备通用性,需要设备预留相关接口。固件一般存储在 Flash 芯片中,并且由于成本、性能等因素限制,一般都不会加密。因此直接从 Flash 芯片中读取固件即 Flash Dump 技术的通用性比较好,是进行 IoT 设备分析的关键技术。
Flash Dump 的流程可以分为四个部分,芯片拆卸、数据读取、固件提取和芯片焊接。这个过程会涉及到一些硬件知识和拆焊技能。从事固件分析的安全研究者一般具备较好的软件背景知识,但不一定了解硬件和焊接,而大多数 Flash Dump 技术文章对硬件相关技术点的介绍比较简略。本文希望填补这个空白,对 FlashDump 过程中涉及的硬件相关知识和焊接技能着重进行介绍。
二、 Flash 芯片拆焊
Flash Dump 技术的第一个难点,是如何在不损坏设备的前提下,对芯片进行拆焊。
2.1. 芯片拆卸
工具:热风枪、风嘴、高温胶带、镊子。
芯片拆卸的核心工具是热风枪,如下图 2‑1 所示。掌握热风枪的正确使用方法,才能够保证成功拆卸芯片。使用热风枪时需要注意两个要素:温度和风速。温度过高会导致器件损坏,温度过低无法融化焊锡。风速过高容易把器件吹跑,风嘴的角度不对也可能导致器件损坏。
图 2‑1 快克 957DW 热风枪
通常如果目标芯片使用含铅焊锡焊接,我们可以将热风枪的温度控制在 330~350 摄氏度之间,如果采用无铅焊锡,则将温度设置在 350~370 摄氏度。为了防止目标芯片周围的器件受到影响,我们可以使用高温胶带将周围的器件包裹起来,起到隔热保护的作用。需要注意的是,有的芯片对焊接温度有特殊要求,如下图 2‑2 所示,对于这样的芯片我们需要以芯片手册为准。
图 2‑2 对温度有特殊要求的 QPX 芯片
风量的控制需要结合实际芯片的尺寸,以快克 957DW 热风枪为例,对于一般芯片可以采用风枪的 3~4 挡。风嘴也需要结合芯片的尺寸来进行选择,如果芯片较大就要选择较大一些的风嘴。
做好了上述工作后,我们就可以启动热风枪,让风嘴在距离芯片 2 厘米左右的高度上均匀加热芯片,如下图 2‑3 所示,等待焊锡融化后就可以用镊子把芯片取下来。
图 2‑3 使用热风枪加热芯片
2.2. 芯片焊接
工具:焊台/电烙铁、烙铁头、锡条、热风枪、风嘴、助焊膏/助焊剂、高温胶带、镊子。
在完成固件提取后,我们需要将芯片重新焊回。焊接芯片的主要工具是焊台/电烙铁和焊锡。常见的 SOP 封装芯片焊接过程可以分为三个步骤,固定芯片、拖焊、去除连锡。
首先需要在芯片的一角打上焊锡,如下图 2‑4 所示:
图 2‑4 在芯片一角上锡
然后用镊子放上芯片,并在对角打上焊锡固定芯片,如下图 2‑5 所示:
图 2‑5 固定芯片对角
然后通过拖焊,将芯片引脚都打上焊锡,如下图 2‑6 所示:
图 2‑6 拖焊四边引脚
这个时候会出现焊锡分布不均匀,把多个引脚粘连起来的情况,称为连锡。我们可以通过在出现连锡位置处加上助焊膏,如下图 2‑7 所示:
图 2‑7 添加助焊膏
然后在用烙铁头加热焊锡并刮去连锡。由于焊接是一项实践性非常强的技能,这里只能就常见的情形进行简略的介绍。实操中还是需要结合实际,勤加练习,才能保证焊接的成功率。对于没有引脚的贴片元件,需要使用热风枪进行吹焊,操作方法和上一节拆卸芯片类似,这里不再详细介绍。
三、Flash 数据读取
工具:多功能编程器、适配器。
完成 Flash 芯片拆卸后,我们就可以开始读取 Flash 中存储的数据。这里我们需要用到多功能编程器和适配器。多功能编程器是用于读写各类存储器数据的专用工具,如下所示,一般需要配合适配器使用。
图 3‑1 TNM-5000 编程器
由于不同厂商、不同型号的 Flash 芯片会采用不同的封装,引脚数目也不相同,因此需要相应的适配器来适配芯片的引脚。
图 3‑2 TSOP48 适配器
在读取数据时,还可能需要对数据进行处理,比如修复错误数据以及去除 ECC 校验位。Flash 芯片分为 NorFlash 和 Nand Flash。如果目标芯片为 NorFlash,则不需要考虑去除 ECC 校验位,可以直接进行固件解析,如果是 Nand Flash 则必须去除 ECC 校验位。下面两节详细介绍了,数据处理的方法和原理。
3.1. 修复数据错误
读取数据的过程中可能由于硬件问题或数据传输的原因(比特翻转),导致部分数据读取出错。因此需要多次读取,并校验读取结果。如果多次读取的内容一致,说明读取过程没有出现问题,如果多次读取的结果不一致,则需要对读取结果进行数据修复。
由于这种数据出错是随机的,因此一般采用基于统计的方法修复错误数据。首先进行多次读取,并统计出所有变化的字节。这些字节在多次读取中出现频率最高的值,即为原始数据的值。
3.2. 去除 ECC 校验位
Nand Flash 包含若干个块,一个块包含若干个页。由于电气特性的限制,Nand Flash 是以页为单位读取,以块为单位擦写。Nand Flash 在擦写过程中,氧化层结构会逐步被破坏,因此 Nand Flash 有擦写次数限制,擦写次数超出限额会形成坏块。
IoT 设备会在软件层面实现坏块管理,充分利用 Nand Flash 的存储空间,延长使用寿命。坏块管理一般使用 ECC 校验算法,ECC 校验算法一般每 256 字节原始数据生成 3 字节校验数据,在 Nand Flash 上存储原始数据的同时会存储校验数据。
由于 ECC 校验算法的使用,导致我们从 Nand Flash 中读出的数据混合了原始数据和校验数据。要想对固件进行正确的解析,必须去除这些校验数据。一般 Nand Flash 每页存储 512 字节原始数据,并分配 16 字节用于存储校验数据、坏块标记和文件系统信息,这 16 字节被称为 spare area。但是原始数据和 spare area 的排布并不是固定的,常见的排布方式有两种,如下图 3‑3 所示:
图 3‑3 Nand Flash 校验数据排布
原始数据和 spare area 的排布是由操作系统层面对 Nand Flash 读写的实现方式决定的,因此没有固定的标准。一般可以根据芯片手册,结合 NandFlash 页大小、spare area 大小以及常见的排布形式进行尝试。
四、固件解析
工具:binwalk。
经过前面几节的工作后,我们已经读取到 Flash 中的固件数据,可以尝试进行固件解析了。固件解析的常用工具是 binwalk。固件解析的目标是提取出文件系统或操作系统镜像。
基于 Linux 的 IoT 设备固件,可以使用 binwalk 直接提取出文件系统。因为 binwalk 对 uboot 镜像格式 uImage 以及常用的文件系统如 ubifs、squashfs、jffs2、yaffs 等有很好的支持。有些 IoT 设备或工控设备会使用 ucos ii、vxworks 等操作系统,这些操作系统可能并没有文件系统支持,而是直接以操作系统镜像的形式载入内存运行。我们依然可以使用 binwalk 做一些前期的分析。比如有些设备也会使用 uboot 做 ucos ii 的引导,找到 uImage 就可以找到操作系统镜像。此外由于大多数 IoT 设备是基于芯片厂商提供的系统和开发环境进行二次开发。如果能获取目标设备对应的芯片厂商文档,对提取操作系统镜像也会有帮助。
看到这里的大佬,动动发财的小手 点赞 + 回复 + 收藏,能【 关注 】一波就更好了
为了感谢读者们,我想把我收藏的一些网络安全/渗透测试学习干货贡献给大家,回馈每一个读者,希望能帮到你们。
干货主要有:
① 2000 多本网安必看电子书(主流和经典的书籍应该都有了)
② PHP 标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ 网络安全基础入门、Linux 运维,web 安全、渗透测试方面的视频(适合小白学习)
⑤ 网络安全学习路线图(告别不入流的学习)
⑥ 渗透测试工具大全
⑦ 2021 网络安全/Web 安全/渗透测试工程师面试手册大全
各位朋友们可以关注+评论一波 然后加下QQ群:581499282 备注:infoq 联系管理大大即可免费获取全部资料
评论