物联网固件分析
有各种各样的开放源代码和封闭源代码工具可以帮助进行固件分析,最好的方法是结合由经验丰富的固件分析师建议的工具和技术。
让我们从最全面的固件分析工具Binwalk开始,Binwalk扫描固件二进制文件并查找已知的模式和签名。
它为物联网设备中使用的各种启动程序和文件系统收集了大量签名,它还具有用于通用加密和压缩算法的签名,以及用于解压缩和解码的相应例程。
Binwalk还能够提取其在固件二进制文件中找到的组件。
以下屏幕截图显示了对示例固件二进制文件的Binwalk扫描的输出:
Binwalk扫描输出
在这个屏幕截图中,Binwalk已经找到并打印出了头文件、引导加载程序和Linux内核以及文件系统。还有从标头文件和组件本身提取的元数据细节,比如每个组件的类型和大小、CRC校验和、重要地址、CPU架构、图像名称等等。现在,你可以继续使用Binwalk本身来提取上述部件,或者根据Binwalk找到的开始偏移量手工计算大小并提取部件。
在解压缩固件组件之后,你可以继续对文件系统进行解压缩、解压甚至挂载,并开始研究文件系统内容。你还可以查看反汇编程序中的引导加载程序代码,或者通过调试器对其进行调试。
但是,进行固件分析并不总是那么简单。固件种类繁多,以至于了解其结构和提取组件通常非常复杂。
让我们仔细看看另一个示例固件,并尝试了解其结构。
1. Binwalk firmware.bin
Binwalk扫描未显示任何结果,这意味着Binwalk找不到任何已知的签名。
Binwalk扫描输出
在本文的示例中,我们可以看到简单的Binwalk扫描不是很有帮助。但是,请注意,还有其他工具和技术可以用来了解有关此固件结构的更多信息。
2. 文件firmware.bin
接下来让我们尝试固件二进制文件上的Linux文件实用程序。
文件实用程序输出
文件实用程序将文件类型显示为Targa图像数据,通过查看二进制文件的开头,并对Targa图像数据签名进行Google搜索,得到的结果显然是假的。
固件二进制文件的第一个字节
这是因为固件文件的第一个字节0x01010000与Targa图像数据签名匹配,参见上面的截图。
3. Binwalk:E firmware.bin
让我们使用Binwalk的另一项功能,并检查固件二进制文件的熵。
使用“ -E”命令选项运行Binwalk会给出固件文件的熵图以及一些其他详细信息,例如下降和上升熵的偏移量。
熵的详细信息
熵图
熵值接近1表示压缩,较低的熵值表示未压缩和未加密的区域。从上面的屏幕截图可以看出,偏移量55296 (0xD800)是高熵部分的开始。
还有另一个工具可以帮助可视化二进制文件,借助binvis.io,你可以在两个并排的窗格中查看固件文件的内容及其可视化,不同的部分根据它们的熵(binvis.io)用不同的颜色表示。
可视化binvis.io创建的固件
4. Binwalk:A firmware.bin
Binwalk还可以扫描二进制文件以查找常见的可执行操作码签名。
在文件中找到的第一个函数序言
在文件中找到的最后一个函数序言
正如我们从上面的截图中看到的,操作码签名检查的结果实际上非常有用!首先,我们可以看到固件属于ARM设备。
其次,如果我们考虑第一个和最后一个函数序言签名的偏移量,我们会得到一个指示,即这些是固件二进制文件中包含代码的部分。
从屏幕截图中,我们还可以看到在函数0xD600处找到了最后一个函数,该地址仅在熵上升部分之前的0x200字节处。由此,我们可以进行有根据的猜测,即该偏移量很可能是启动加载程序代码的结尾和压缩内核模块的开头。
5. Hexdump -C
- hexdump -C firmware.bin | grep -C 4 -e “^\*$”
既然我们知道了固件文件中某些组件的大致边界,可以尝试通过查看这些区域周围固件文件的实际内容来确认这些边界偏移量。
如果我们通过十六进制转储运行固件文件,并查找仅包含星号“*”的行,我们可以找到编译器为每个固件组件添加的填充。
固件二进制文件的内容
固件二进制文件其他部分的内容
Hexdump实用程序的输出以及之前的发现,确认了包含ARM代码的固件二进制文件中的这一部分,我们先前怀疑此代码属于启动加载程序。
6. 字符串:radix = x firmware.bin
接下来,让我们从固件中提取ASCII字符串及其偏移量。
固件二进制文件中找到的最后一个ASCII字符串
查看上面的屏幕截图,有一些与模块入口点相关的字符串,这些字符串可以很好地表明所涉及代码的性质。
在下面的屏幕截图中,我们可以从固件二进制文件的开头看到一些其他有趣的字符串。例如,“MctlApplet.cpp”库名称可用于从同一开发人员中查找其他二进制文件或程序包,拥有来自同一供应商的其他固件映像有助于更好地了解二进制结构。
来自同一截屏的另一个有趣的字符串是“Not Booting from softloader”,它可以指示进程状态或者这个模块的性质。
包含“Assert()”的字符串可以建议有关代码的不同信息,在固件开发中,使用Asserts是一种常见的做法,因为它可以帮助开发人员在开发和生产阶段调试和故障调试代码。
在固件二进制文件中找到第一个ASCII字符串
7. IDA:parm firmware.bin
可以看到,我们已经从此固件二进制文件中收集了许多有价值的信息,这些信息在一开始看起来是相当难以理解的。
现在让我们使用IDA来检查代码,由于此二进制文件不是带有显示ISA的标准标头的ELF文件,因此我们需要明确告知IDA使用ARM指令集来反汇编代码。
IDA中部分函数的反汇编视图
上面来自IDA的屏幕截图显示了如何使用前面分析步骤中找到的字符串来帮助查找对内核模块入口点的调用。
8. dd
现在,可以继续提取固件二进制文件的一部分,我们的分析发现它是引导加载器模块。
9. Qemu
从固件二进制文件中提取了所有模块(文件系统内容,内核模块和其他组件)之后,我们可以使用Qemu运行二进制文件,甚至模拟与本机不同的体系结构的文件,并开始与他们互动。
总结
物联网设备的数量每天都在增加,从工业控制系统、智能城市、智能汽车到移动电话、网络设备、个人助理、智能手表和各种各样的智能家电。
物联网设备源自已经存在多年的嵌入式系统,由于嵌入式设备的软件性质不同,因此与通用计算机系统相比,嵌入式设备软件的制造和开发始终具有不同的优先级。这些优先次序是由设备本身有限和具体的功能、基础硬件有限的能力和能力以及开发的代码无法用于后来的修改和修改而形成的。然而,物联网设备与传统嵌入式系统有显著的区别。现在大多数物联网设备运行在硬件上,这些硬件具有与通用计算机系统类似的能力。
随着物联网设备的日益普及,它们现在正在访问和控制我们生活的许多方面以及日常交互。物联网设备现在可以潜在地为恶意攻击者提供前所未有的攻击机会。这凸显了物联网设备中安全性的重要性,也显示了围绕该主题进行研究的必要性。好消息是,目前已经有许多工具和技术可用于协助该主题的研究。
本文翻译自:
https://www.trendmicro.com/en_us/research/20/i/exploitable-flaws-found-in-facial-recognition-devices.html