记一次提取固件根文件系统
固件提取的对象
固件提取的对象通常是嵌入式设备或网络设备的固件。这些设备包括但不限于路由器、交换机、摄像头、智能家居设备等。这些设备通常都有自己的操作系统和固件,用于管理设备的功能和提供服务。对这些设备的固件进行提取可以帮助安全研究人员分析设备的漏洞和安全性,也可以帮助设备制造商测试和优化设备的性能。
固件提取的对象格式通常是二进制文件,其格式一般为压缩格式,如zip、tar、gz、chk等。这些压缩文件中包含了设备的操作系统、驱动程序、配置文件和其他相关文件。此外,固件提取的对象也可能是固件映像文件,如bin、img、rom等格式,这些文件包含了设备的完整固件映像,可以直接烧录到设备中。无论是压缩文件还是固件映像文件,都需要进行解压缩或解包才能提取其中的内容。
固件的格式
我们想要的就是文件数据部分。
提取方法
待提取的文件
XR300-V1.0.2.24_10.3.21.chk
获取固件文件头的大小
由于我们想提取出来的是FLASH中的内容,不需要关心头部的格式是什么(头部魔数只是用来标识该文件的文件类型),因此需要明白头部的偏移量是多少。
方法一:
使用命令:hexdump -C 文件名字 |grep hsqs
从结果中可以看到,解析出来的头部大小是002115d0,不过这是16进制表示的,还需要将他转换为10进制。
使用python或者win10自带的计算器可以很容易实现。
可能会有疑问,为啥hexdump显示的是002115d0,但是Python中写的确是0020115d6?这是因为hexdump只是帮我们找到头部hsqs所在的16个字节的起始位置,因此002115d0对应的是字符t的偏移量,而不是hsqs,他两之间还差了六个字节:t.{0o.
所以hexdump使用起来还是需要注意一下实际的头部位置。下面介绍一种更加“傻瓜”式的获取头部大小的方法。
方法二:
ubuntu中内置的binwalk可以很轻松的帮助我们提取固件的头部大小。
使用命令:binwalk+固件名字
对固件具体内容进行提取
现在我们获取了固件的头文件大小,接下来就是跳过头文件,转而提取我们想要的文件主题内容了。
使用dd命令拆分固件主题内容,命令格式如下:
dd if=待提取的固件名字 of=将提取内容保存的文件 bs=n ship=k
n表示一次提取多少个字节,
k表示跳过的内容,即之前获取的头部的大小。
提取之后,可以看到当前目录下多了一个目录squash,里面保存了刚才提取出来的内容。
首先使用file命令查看一下该文件的类型
发现是一个squash类型,这是一个压缩的文件格式。通过binwalk中的-E命令查看文件的熵值也可以看出这是一个高度压缩的文件。熵值越接近于1,表示文件的压缩程度越高。
熵值变化图片
可以使用unsquashfs命令或binwalk命令对squash类型中的文件与目录进行提取。下面展示unsquashfs命令提取结果。
这个时候我们发现当前目录下多了一个squashfs-root目录,里面存放了提取出来的内容。转到该文件进行查看,发现里面的东西都是我们熟悉的Linux下的文件类型了。至此,固件内容提取完成。