一、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 备注:csdn 联系管理大大即可免费获取全部资料