接口识别/调试
工具:SDR、万用表、烙铁、热风枪、烧录座等等,土豪可以再买个示波器、电子显微镜;一些使用的命令行级别的工具,如file、hexdump、strings、dd、lzma、7z等
接口有UART、JTAG、I2C、SPI等
UART(通用异步接收器发送器)
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,通常称作UART) 是一种串行异步收发协议,可将要传输的数据在串行通信与并行通信之间加以转换,应用较为广泛;
UART是一种硬件组件,允许两个硬件外围设备之间的异步串行通信。它们可以位于同一块电路板上,也可以位于两个不同的设备之间,可以允许通过串行读取/写入设备;
UART主要是用于主机与辅助设备之间通信,如:音响and外接ap之间;
数据包:
数据包由以下几个部分组成:
1、起始位:表示传输数据开始。通常是低脉冲(0),可以在逻辑分析仪中查看。
2、消息:要以八位格式传输的实际消息,如:传输值为A(十六进制-0X41),在消息中被传递为0、1、0、0、0、0、0、和1。
3、奇偶校验位:根据情况,大多数现实生活中无关紧要,设备都是未使用校验位。奇偶校验位用于通过计算消息中1或0的数量,来执行错误和数据损坏的检查,并根据奇校验和偶校验来表明数据传输是否正确。注:校验位仅用于数据损坏检查和验证,而不用于实际校验。
4、停止位:表示结束的标志。通常是高脉冲(1)实现,但也可以由多个高脉冲实现。
大多数设备都是使用8N1配置,此配置代表8个数据位、无验证位、有一个停止位。
在分析的时候也会用到一些设备,逻辑分析仪;
逻辑分析仪是一种可以显示数字电路中各种信号的电平的设备。
如:Salesa逻辑分析仪、Open Workbench逻辑分析仪等
为了方便调试,很多iot的设备都会把UART引脚引到PCB上,
上图标注的四个就是UART的四个引脚位置, 每个引脚都是有自己的作用;
VCC:供电引脚,通常电压为3.3-5V,如设备没有供电保护,这个引脚一般不接电源,通过转接口进行供电,相对安全一些;
GND:接地引脚,表示负极;
Rx:接收引脚,从另一端接收数据至设备;
Tx:发送引脚,将数据从设备传输到另一端;
注:通过对芯片具有不同功能的引脚输入不同的高低电平,完全对主设备的控制和调试;
JTAG 介绍
JTAG属于微控制器调试接口。微控制器具有在运行期间使用指定引脚进行调试的规定,这些引脚连接到电路板上的引脚。这些引脚(端口)由开发人员和设计人员用于调试,读/写固件和微控制器内部存储器,生产后控制/测试微控制器引脚。这使得调试端口成为最关键的攻击面之一,因为它为攻击者提供了强大的功能和访问权限。除了JTAG之外,还包括cJTAG、SWD。
TAP包含5个信号接口:
1、TCK:为TAK操作提供一个独立的基本的时钟信号
2、TMS:用来控制TAP状态机的转换
3、TDI:是JTAG指令和数据的串行输入端。
4、TDO:是JTAG指令和数据的串行输出端
5、TRST:是JTAG电路的负位输入信号,低电平有效
注:TAP控制器共有16种状态。
JTAG提供多种接口标准,常见的有10针、14针、16针、20针
注:除了这两种还有一些其它的可以参考我以前的文章;
调试UART
方法大同小异,不在此阐述;
文件系统
我们将固件逆向以查看其内部组件。固件中的内部组件包括 boot-loader、内核、文件系统以及其他内容。其中我们最感兴趣的是文件系统也是作为突破口的地方,因为文件系统中保存了我们需要的所有信息;
固件是一个二进制文件压缩包,而文件系统只是其中的一个组件,存储在二进制文件的特定偏移地址中,且具有一定的尺寸。然而,此时我们还不知道关于固件中文件系统的任何信息,包括其偏移量和尺寸。为了找到这些信息,需要使用 hexdump 和 grep 等工具来搜索我们所关注内容的特征信息;
SquashFS文件系统
简述
SquashFS是一套供linux内核使用的只读压缩文件系统,压缩率高,遵循GPL开源协议;
对于iot等嵌入式设备来讲,使用SquashFS可以降低成本;
使用NAND闪存作为存储介质的嵌入式设备中,使用SquashFS前提是内核要支持SquashFS,同时还要支持MTD字符设备和块设备;
SquashFS适用于长时间开机的设备且对稳定性要求较高的,所以物联网设备多采用SquashFS;
特点
· 数据(data),节点(inode)和目录(directories)都被压缩
· 保存了全部的 32 位 UID/GIDS 和文件的创建时间
· 最大支持 4G 文件系统
· 检测并删除重复文件
标准
标准固件大端序模式为sqsh,标准固件小端序模式为hsqs,LZMA压缩下的大端序模式为sqlz,3.3版本的Squashfs文件系统在LZMA压缩下的大端序模式为qshs,部分非标准固件小端序模式为shsq,DD-WRT固件小端序模式为hsqt,DD-WRT固件大端序模式为tqsh;
SquashFS文件系统判断
binwalk DVRF_v03.bin
项目地址:https://github.com/ReFirmLabs/binwalk
工具获取:https://www.123pan.com/s/s0u0Vv-XgRwd提取码:1JsH
JFFS2 文件系统
简述
JFFS2 是 RedHat的 David Woodhouse 在 JFFS 基础上改进的文件系统,是用于微型嵌入式设备的原始闪存芯片的实际文件系统。。
文件头标识
JFFS2文件系统通常使用"0x1985"作为头部特征标识符;
结构
JFFS2在闪存介质上存在两种类型的结构(jffs2_raw_inode和jffs2_raw_dirent),jffs2_raw_inode包含文件的管理数据,jffs2_raw_dirent用于描述文件在文件系统中的位置;
真正的数据存储在jffs2_raw_inode节点的后面,大部分的数据都是在系统挂载之后建立起来的;这两种类型的结构由公共的文件头结构,jffs2_unknown_node;
在jffs2_unknown_node结构中,有一个jint32_t类型和hdr_crc变量,代表了文件头部中其他字段的CRC(循环沉余效验)值;
JFFS2是使用CRC来验证存储数据的正确性的;
特点
· 优点使用了压缩的文件格式。最重要的特性是可读写操作。
· 缺点JFFS2 文件系统挂载时需要扫描整个 JFFS2 文件系统,因此当 JFFS2 文件系统分区增大时,挂载时间也会相应的变长。使用 JFFS2 格式可能带来少量的 Flash 空间的浪费。这主要是由于日志文件的过度开销和用于回收系统的无用存储单元,浪费的空间大小大致是若干个数据段。JFFS2 的另一缺点是当文件系统已满或接近满时, JFFS2 运行速度会迅速降低。这是因为垃圾收集的问题。
加载步骤
· 步骤 1. 扫描整个芯片,对日志节点进行校验,并且将日志节点全部装入内存缓存。
· 步骤 2. 对所有日志节点进行整理,抽取有效的节点并整理出文件目录信息。
· 步骤 3. 找出文件系统中无效节点并且将它们删除。
· 步骤 4. 最后整理内存中的信息,将加载到缓存中的无效节点释放。
注:
因为JFFS2是一种日志文件系统,所以不论电源以那种方式在任何时间停止供电,JFFS2都可以保持数据的文章性;
当系统因为突然掉电重启时候,JFFS2会自动将系统恢复到掉电前的一个稳定状态(文件系统在稳定状态之后的改变将无法进行恢复);
JFFS2针对NOR闪存和NAND闪存设备都提供了掉电保护功能,这可以使用户的数据更加稳定和安全,不用担心数据因为断点丢失和无法恢复;
所以嵌入式系统很适合使用这两种闪存介质;
YAFFS2 文件系统
简述
yaffs2 是专门为 NAND Flash 设计的嵌入式文件系统。它采用的是日志结构的文件系统,提供了损耗平衡和掉电保护,可以有效地避免意外掉电对文件系统一致性和完整性的影响。
YAFFS2(Yet Another Flash File System)闪存文件系统,是唯一一个专为NAND闪存设计的文件系统;
YAFFS2使用独立的日志文件来跟踪文件系统内容的变化;
YAFFS有两个版本:YAFFS和YAFFS2;
§ YAFFS只支持页面大小为512B(小页)的NADN闪存
§ YAFFS2是YAFFS的升级版本,向下兼容NADN闪存的情况下,也能很好的支持页面大小为2KB(大页)的NADN闪存;
当系统掉电重启后,YAFFS2和JFFS2不同,YAFFS2不像JFFS2那样使用旧文件对新文件进行覆盖,YAFFS2针对已写入的部分使用新的文件,针对未写入的部分使用旧的文件;
这个方式增强掉电时未写入文件的安全性能,在写入新文件时,不会因为掉电而导致文件丢失等,而是把这部分新写入的文件完好的保存;
优缺点
· 优点− 专门针对 NAND Flash,软件结构得到优化,速度快。− 使用硬件的 spare area 区域存储文件组织信息,启动时只需扫描组织信息,启动比较快。− 采用多策略垃圾回收算法,能够提高垃圾回收的效率和公平性,达到损耗平衡的目的。
· 缺点没有采用压缩的文件格式。当包含的内容相同时, yaffs2 镜像文件要比 jffs2 镜像文件大。
USBIFS 文件系统
简述
懒得写了,对不起,555
CramFS 文件系统
头特征
Cramfs文件系统头部特征字符为"0x28cd3d45"
简述
CramFS文件系统是专门针对闪存设计的只读、压缩的文件系统,它不需要一次性地将文件系统中的所有内容解压到RAM中,而是在系统需要访问某个位置的数据时,马上计算出该数据在CramFS中的位置,并将其解压到RAM中,然后通过内存访问来获取数据。也就是说,在使用CramFS时,如果嵌入式设备需要储存暂时性的数据,就必须另外保留一个闪存空间进行储存。
cramfs 是针对 Linux 内核 2.4 之后的版本所设计的一种新型文件系统,使用简单,加载容易,速度快。
优缺点
· 优点将文件数据以压缩形式存储,在需要运行时进行解压缩,能节省 Flash 存储空间。
· 缺点由于它存储的文件是压缩的格式,所以文件系统不能直接在 Flash 上运行。同时,文件系统运行时需要解压数据并拷贝至内存中,在一定程度上降低读取效率。另外 cramfs文件系统是只读的。
文件系统手动提取
系统命令 |
作用 |
选项 |
file |
用于文件类型识别 |
-L:查看链接文件 |
grep |
用于查找文件里符合条件的字符串 |
-i:忽视大小写 -s:不显示错误信息 -a:不忽略二进制数据 |
hexdump |
将二进制文件转换为ASCII、八进制、十进制、十六进制格式进行查看 |
-C:输出规范的十六进制和ASCII码 -n length:格式化输出文件的前length个字节 -s:从偏移量开始输出 |
strings |
在对象文件或二进制文件中查找可打印的字符串 |
-n:显示的最少字符数 -a:扫描整个文件 |
dd |
从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出 |
if=文件名:指定输入文件 of=文件名:指定输出文件 bs=bytes:设置输入/输出块大小为bytes字节 skip=blocks:从输入文件开头跳过blocks个块后再开始复制 |