talentFirmware固件提取及分析技术
概念
固件(firmware)是⼀种写⼊硬件设备的软件,作⽤是对应⽤和各项系统功能实时控制。固件中包含底层代码,这些代码能实现软件对硬件的操作。运⾏固件的设备称为嵌⼊式系统,嵌⼊式系统的硬件资源在存储能⼒以及内存等⽅⾯往往具有诸多限制。举例来说,智能⼿机、智能终端、交通信号灯、⽆⼈机、机顶盒都是运⾏固件的嵌⼊式设备。
固件通常由bootloader、内核、根⽂件系统及其他资源组成。根据嵌⼊式linux、嵌⼊式windows(WinCE)、windowsIOT内核及各种实时操作系统(RTOS)的区别,固件也有多种类型。
下图是固件的组成,即闪存(或EEPROM)、bootlodaer、内核和根⽂件系统。
图1 固件基本构成
北京百知教育科技有限公司
bootloader
bootloader的作⽤主要包括RAM的初始化(存储易失性数据),串⼝初始化、设备类型检测、内核参数链表设置、initramfs(基于RAM 的初始⽂件系统)加载及内核镜像调⽤等。Bootloader通过板机⽀持包(BSP)初始化硬件驱动。简单的说,bootloader和PC的BIOS在启动时的作⽤是⼀致的。ARM、MIPS架构架构中常见的bootloader包括redboot、u-boot及barebox等,本⽂主要对固件中的根⽂件分析技术进⾏阐述,涉及bootloader的部分不再赘述。在bootloader启动内核后,⽂件系统也就完成了加载过程。
根⽂件系统
根⽂件系统⾸先是内核启动时所mount的第⼀个⽂件系统,内核代码映像⽂件保存在根⽂件系统中,⽽系统引导启动程序会在根⽂件系统挂载之后从中把⼀些基本的初始化脚本和服务等加载到内存中去运⾏。
Linux根⽂件系统中⼀般有如下的⼏个⽬录:
/bin⽬录
该⽬录下的命令可以被root与⼀般账号所使⽤,由于这些命令在挂接其它⽂件系统之前就可以使⽤,所以/bin⽬录必须和根⽂件系统在同⼀个分区中。
陪同口译一天多少钱/sbin ⽬录
该⽬录下存放系统命令,即只有系统管理员(俗称最⾼权限的root)能够使⽤的命令,系统命令还可以存放在/usr/sbin,/usr/local/sbin ⽬录下,/sbin⽬录中存放的是基本的系统命令,它们⽤于启动系统和修复系统等,与/bin⽬录相似,在挂接其他⽂件系统之前就可以使
前呼后拥
⽤/sbin,所以/sbin⽬录必须和根⽂件系统在同⼀个分区中。
/dev⽬录
该⽬录下存放的是设备与设备接⼝的⽂件,设备⽂件是Linux中特有的⽂件类型,在Linux系统下,以⽂件的⽅式访问各种设备,即通过读写某个设备⽂件操作某个具体硬件。
/etc⽬录
该⽬录下存放着系统主要的配置⽂件,例如⼈员的账号密码⽂件、各种服务的其实⽂件等。⼀般来说,此⽬录的各⽂件属性是可以让⼀般⽤户查阅的,但是只有root有权限修改。
/lib⽬录
该⽬录下存放共享库和可加载(驱动程序),共享库⽤于启动系统。运⾏根⽂件系统中的可执⾏程序,⽐如:/bin /sbin ⽬录下的程序。
/root⽬录
系统管理员(root)的主⽂件夹,即是根⽤户的⽬录,与此对应,普通⽤户的⽬录是/home下的某个⼦⽬录。
/var⽬录
/var⽬录中存放可变的数据,⽐如spool⽬录(mail,news),log⽂件,临时⽂件。
/proc⽬录
这是⼀个空⽬录,常作为proc⽂件系统的挂接点,proc⽂件系统是个虚拟的⽂件系统,它没有实际的存储设备,⾥⾯的⽬录,⽂件都是由内核临时⽣成的,⽤来表⽰系统的运⾏状态,也可以操作其中的⽂件控制系统。
/mnt⽬录
⽤于临时挂载某个⽂件系统的挂接点,通常是空⽬录,也可以在⾥⾯创建⼀引起空的⼦⽬录,⽐如/mnt/cdram /mnt/hda1 。⽤来临时挂载光盘、移动存储设备等。
/tmp⽬录
⽤于存放临时⽂件,通常是空⽬录,⼀些需要⽣成临时⽂件的程序⽤到的/tmp⽬录下,所以/tmp⽬录必须存在并可以访问。
对于嵌⼊式Linux系统的根⽂件系统来说,⼀般可能没有上⾯所列出的那么复杂,⽐如嵌⼊式系统通常都不是针对多⽤户的,所以/home这个⽬录在⼀般嵌⼊式Linux中可能就很少⽤到,⽽/boot这个⽬录则取决于你所使⽤的BootLoader是否能够重新获得内核映象从你的根⽂件系统在内核启动之前。⼀般说来,只有/bin,/dev,/etc,/lib,/proc,/var,/usr这些需要的,⽽其他都是可选的。
固件可以采⽤的⽂件类型有很多种,常见的有squashfs【1】、cramfs、ext2、jeffs2等。其中设备(尤其是消费级电⼦设备)最常采⽤的⽂件系统是squashfs,分析⼈员可以使⽤unsqushfs⼯具对⽂件系统提取数据。需要注意的时,有些⼚商采⽤了⾮标准的squasgfs压缩算法,如LZMA和XZ。本⽂中以某路由潘多拉固件为模型,对该固件进⾏提取和分析,关于本固件的⽂件系统和压缩算法如下所⽰:
图2 固件⽂件系统及压缩算法(放⼤观看细节)
该固件⽂件即为squashfs⽂件系统,并使⽤LZMA和XZ压缩算法。
【1】注:SquashFS是基于Linux内核使⽤的压缩只读⽂件系统。该⽂件系统能够压缩系统内的⽂档,inode以及⽬录,⽂件最⼤⽀持2^64字节。每⼀个⽂件都有对应的inode,⾥⾯包含了与该⽂件有关的⼀些信息。inode包含⽂件的元信息,具体来说有Size ⽂件的字节数、Uid ⽂件拥有者的Ur ID、Gid ⽂件的Group ID、Access ⽂件的读写执⾏权限等。linux可以⽤stat命令,查看某个⽂件的inode信息。
如果sasquatch⼯具不起作⽤,也可以使⽤7-zip对后缀为squashsf的⽂件进⾏提取(推荐本⽅式)。
从分析⾓度出发,可以把⽂件系统看作存储配置⽂件、服务、账号⼝令、哈希、应⽤程序代码及启动脚本的地⽅。
关于固件研究的范围
从⼴义上讲,固件分为两种形式,第⼀种,对于独⽴可操作的电⼦产品,固件⼀般指它的操作系统(担任着⼀个数码产品最基础、最底层⼯作的软件才可以称之为固件,这和操作系统的定义很⼀致)。⽐如交换机的固件,就是指交换机的操作系统。同理,IPHONE的固件也是其操作系统,路由
器的固件就是路由器的操作系统,MP4的固件就是MP4的操作系统等。
第⼆种,⽽对于⾮独⽴的电⼦产品,⽐如硬盘、⿏标、BIOS、光驱、U盘等设备,固件就是指其最底层的,让设备得以运⾏的程序代码。
本⽂阐述的范围限定于第⼀种形式。
固件的提取与分析
根⽂件识别与提取
通常固件⽂件以bin、zip、LZMA、arj等⽂件压缩类型封装,其中,最常见的为bin和zip格式,bin⽂件是⼆进制镜像形式,需要使⽤binwalk提取squashsf⽂件系统。
以下为典型的⼆进制镜像提取⽂件系统的例程:
[root@localhost dm203]# binwalk -e PandoraBox.bin
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
incident0 0x0 uImage header, header size: 64 bytes, header CRC: 0x2E8A7ACF, created: 2019-01-01 09:25:02, image size: 1452817 bytes, Data Address: 0x80000000, Entry Point: 0x80000000, data CRC: 0x9C0D7442, OS: Linux, CPU: MIPS, image type: OS Kernel Image, compression type: lzma, image name: "MIPS PandoraBox Linux-3.14.79"
64 0x40 LZMA compresd data, properties: 0x6D, dictionary size: 8388608 bytes, uncompresd size: 4577808 bytes
WARNING: ute failed to run external extractor 'sasquatch -p 1 -le -d 'squashfs-root' '%e'': [Errno 2] No such file or directory, 'sasquatch -p 1 -le -d 'squashfs-root' '%e'' might not be installed correctly
WARNING: ute failed to run external extractor 'sasquatch -p 1 -be -d 'squashfs-root' '%e'': [Errno 2] No such file or directory, 'sasquatch -p 1 -be -d 'squashfs-root' '%e'' might not be installed correctly
1453905 0x162F51 Squashfs filesystem, little endian, version 4.0, compression:xz, size: 7132962 bytes, 2102 inodes, blocksize: 262144 bytes, created: 2018-12-31 13:03:10
[root@localhost _acted]# ls
162F51.squashfs 40 40.7z squashfs-root
对于bin⽂件来说,可能未必是⼆进制镜像⽂件,也可能是数据⽂件,⾸先要对⽂件进⾏识别,可以借助linux下的file命令,如下所⽰:
e bay
[root@localhost dm203]# file PandoraBox.bin
PandoraBox.bin: u-boot legacy uImage, MIPS PandoraBox Linux-3.14.79, Linux/MIPS, OS Kernel Image (lzma), 1452817 bytes, Tue Jan 1 17:25:02 2019, Load Address: 0x80000000, Entry Point: 0x80000000, Header CRC: 0x2E8A7ACF, Data CRC: 0x9C0D7442
这是⼀个嵌⼊式linux/MIPS架构的镜像⽂件,可以使⽤binwalk提取出squashsf后缀⽂件(有时也可能是其他后缀)。
对提取出的⽂件系统可以借助hexdump及grep进⼀步确认:
[root@localhost _acted]# hexdump -C 162F51.squashfs |grep -i 'hsqs'
68 73 71 73 36 08 00 00 8e 13 2a 5c 00 00 04 00 |*\....|
如上所⽰,地址00包含squashsf的头部特征【2】。
通过对bin⽂件的提取,获得了后缀为squashfs的固件⽂件,该⽂件需要进⼀步解压,从⽽获得固件的根⽂件(本例为7-zip⽅式提取)。
图3 提取的根⽂件系统
【2】注:squashsf⽂件系统的头部特征已知的有七种:标准固件⼤端sqsh、标准固件⼩端hsqs、LZMA压缩的⼤端sqlz、squashfs3.3在LZMA压缩下的⼤端qshs部分⾮标准⼩端shsq(D-LINK固件)、DD-WRT固件⼩端hsqt、DD-WRT固件⼤端tqsh。
DWR-932_fw_revB_2_02_eu_en_20150709.zip是经过加密的压缩包,⽆法直接解压缩,这是⼚商对固件做了保护,防⽌逆向分析。使⽤frackzip⼯具可以破解该zip密码,这⾥直接给出该压缩包的密码:beUT9Z。
解压后得到另⼀个40.zip的压缩包,继续对40.zip解压,获得下列⽂件:
图4 932b固件镜像⽂件
其中,后缀为yaffs2的⽂件就是包含932b固件根⽂件的镜像。这⾥顺带说⼀下yaffs⽂件系统,Yaffs(Yet Another FlashFile System)⽂件系统是专门针对NAND闪存设计的嵌⼊式⽂件系统,⽬前有YAFFS和YAFFS2两个版本,两个版本的主要区别之⼀在于YAFFS2能够更好的⽀持⼤容量的NAND FLASH芯⽚。
尝试对yaffs2⽂件提取,⾸先使⽤的是binwalk,但⽆法提取出根⽂件系统(见如下提取过程):
[root@localhost 40]# binwalk -e 2K-mdm9625-usr-image.usrfs.yaffs2
考研专业课真题下载DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
WARNING: ute failed to run external extractor 'yaffshiv --auto --brute-force -f '%e' -d 'yaffs-root'': [Errno 2] No such file or directory, 'yaffshiv --auto --brute-force -f '%e' -d 'yaffs-root'' might not be installed correctlycheer up
0 0x0 YAFFS filesystem, little endian
6336 0x18C0 ELF, 32-bit LSB shared object, ARM, version 1 (SYSV)
284836 0x458A4 ELF, 32-bit LSB shared object, ARM, version 1 (SYSV)
291456 0x47280 ELF, 32-bit LSB shared object, ARM, version 1 (SYSV)
339328 0x52D80 ELF, 32-bit LSB shared object, ARM, version 1 (SYSV)
346368 0x54900 ELF, 32-bit LSB shared object, ARM, version 1 (SYSV)
359040 0x57A80 ELF, 32-bit LSB shared object, ARM, version 1 (SYSV)
383404 0x5D9AC ELF, 32-bit LSB shared object, ARM, version 1 (SYSV)
388608 0x5EE00 ELF, 32-bit LSB shared object, ARM, version 1 (SYSV)
389367 0x5F0F7 mcrypt 2.2 encrypted data, algorithm: blowfish-448, mode: CBC, keymode: 8bit
403392 0x627C0 ELF, 32-bit LSB shared object, ARM, version 1 (SYSV)
433596 0x69DBC Unix path: /usr/lib/xtables
438592 0x6B140 ELF, 32-bit LSB shared object, ARM, version 1 (SYSV)
北京夜大445632 0x6CCC0 ELF, 32-bit LSB shared object, ARM, version 1 (SYSV)
1196884 0x124354 Unix path: /usr/lib/gio/modules
1210088 0x1276E8 PEM RSA private key
1210292 0x1277B4 PEM certificate
1230336 0x12C600 XML document, version: "1.0"
1245430 0x1300F6 Unix path: /var/run/dbus/system_bus_socket
1267812 0x135864 Unix path: /var/lib/dbus/machine-id
………………………………………………………………………………………………….
[root@localhost _2K-mdm9625-usr-image.acted]# ls个人房屋租赁发票
0.yaffs 194E86A.zlib 195F07C.zlib 1968A0E.zlib 196B67C.zlib 196C740.zlib 19705CE.zlib 197533C.zlib 19763BC.zlib 197710E.zlib 197818E.zlib 197AACE.zlib
194E86A 195F07C 1968A0E 196B67C 196C740 19705CE 197533C 19763BC 197710E 197818E 197AACE
显然提取后的⽂件夹中并⾮根⽂件系统,查阅资料后,了解到932b采⽤了yaffs的原⽣态压缩算法,需要使⽤⼯具unyaffs提取。
图5 提取932B根⽂件系统
将镜像⽂件提取到yaffs2-root⽬录,获得完整的932B根⽂件系统。
固件分析
固件的分析可以采⽤⼈⼯或⼯具⽅式进⾏。本⽂介绍其中的三种分析⽅法:
⽂件分析
--log_file /usr/inadyn_srv.log