第28章 固件逆向基础

说实话,固件逆向是我个人觉得最有意思的领域之一。你想想看,一个路由器、一个智能插座、一台摄像头——这些设备里都藏着一个完整的操作系统。而我们今天要做的,就是把这些固件拆开,看看里面到底有什么。

我在做IoT安全评估时,经常遇到这样的场景:客户拿来一个设备,说「帮我看看有没有后门」。嗯,第一步就是拿固件开刀。今天这一章,我就带你走一遍固件逆向的完整流程。

什么是固件?

固件,说白了就是「固化在硬件里的软件」。它不像你电脑上的程序可以随便删改,而是直接烧录在Flash、ROM这类非易失性存储器里的。

一个典型的固件包含三部分:

  • 引导加载程序(Bootloader):负责初始化硬件、加载内核。常见的有U-Boot、RedBoot。
  • 操作系统内核:绝大多数嵌入式设备跑的是Linux,也有用VxWorks、FreeRTOS的。
  • 文件系统:存放应用程序、配置文件、Web界面等。

我遇到过最离谱的一次,一个路由器固件解包后,发现里面藏着一个完整的Python环境。你猜怎么着?攻击者就是利用这个环境执行了恶意脚本。所以,分析固件不只是技术活,更是安全审计的关键一步。

常见固件格式

做逆向,首先得认识文件格式。我整理了一张表,方便你对照:

格式 扩展名 特点 常见场景
原始二进制 .bin 无结构,纯机器码,从固定地址开始执行 路由器、单片机固件
Intel HEX .hex 文本格式,每行包含地址、数据和校验 微控制器、Arduino
ELF .elf 可执行与链接格式,包含段表、符号表 Linux内核、应用程序
SREC .s19/.s28 Motorola格式,类似HEX但更灵活 汽车ECU、工业设备

我个人习惯,拿到一个.bin文件,先用file命令看一眼。很多时候它直接告诉你「这是Linux内核」或者「这是gzip压缩数据」。别小看这一步,能省不少时间。

固件提取与解包:binwalk

说到固件分析,binwalk是绕不开的神器。它就像一个「固件扫描仪」,能自动识别文件里嵌入的各种数据块。

基本用法很简单:

# 扫描固件中的文件签名
binwalk firmware.bin

# 自动提取所有识别到的文件
binwalk -e firmware.bin

# 递归提取(解包后再解包)
binwalk -Me firmware.bin

我曾经分析过一个TP-Link的路由器固件,binwalk扫出来一堆东西:

  • 开头是U-Boot引导程序
  • 中间有一段LZMA压缩的Linux内核
  • 后面跟着SquashFS文件系统
  • 最后还有一段JFFS2分区

你看,一个固件里藏着这么多层。binwalk的-e参数会自动解压、解包,但有时候它也会漏掉一些自定义格式。这时候就得手动分析了。

小技巧: 如果binwalk提取不完整,试试binwalk -D 'type:offset:size'手动指定提取范围。我经常用这个方法处理那些「半加密」的固件。

固件分析:文件系统、内核、应用程序

固件解包后,你会得到一个目录树。里面通常有:

  • /bin、/sbin:核心命令,比如busybox
  • /etc:配置文件,包括密码、网络设置
  • /usr/bin:用户态应用程序
  • /lib:动态链接库
  • /www:Web管理界面(很多漏洞就藏在这里)

我一般会先看/etc/shadow/etc/passwd,看看有没有硬编码的密码。有一次我找到一个设备,root密码直接写在脚本里——「admin:admin」。嗯,这种「安全设计」我见得太多了。

接下来是内核分析。解压出来的内核镜像(通常是vmlinux或zImage)可以用file命令确认架构:

file vmlinux
# 输出示例:vmlinux: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1

知道架构后,就可以用IDA Pro或Ghidra加载内核了。我个人更习惯用Ghidra,因为它免费,而且对MIPS、ARM的支持不错。

实战:分析一个路由器固件

好,理论说完了,咱们来点实际的。假设你拿到了一个路由器固件,叫router_fw.bin。我会按以下步骤操作:

  1. 初步扫描binwalk router_fw.bin,看看里面有什么
  2. 提取文件系统binwalk -Me router_fw.bin
  3. 分析文件系统:进入提取出的目录,查看关键文件
  4. 查找漏洞:搜索硬编码密码、命令注入点、后门
  5. 逆向Web界面:分析/www目录下的CGI脚本

下面这张图,是我总结的固件逆向整体流程:

固件逆向分析流程 获取固件 官网下载/从Flash读取 扫描与提取 binwalk -Me 文件系统分析 SquashFS/JFFS2/UBIFS 关键文件检查 /etc/passwd, /etc/shadow, /www/*.cgi 漏洞挖掘 硬编码密码、命令注入、后门 输出分析报告 内核分析 vmlinux/zImage 架构识别 MIPS/ARM/x86

在实际操作中,我遇到过最头疼的情况是固件被加密了。厂商把整个固件用AES加密,binwalk扫出来全是乱码。这时候怎么办?

注意: 加密固件需要先找到解密密钥。密钥通常藏在Bootloader里,或者从UART串口输出中获取。我曾经花了两天时间,从一个智能灯泡的固件里逆向出AES密钥——过程很痛苦,但结果很爽。

最后,给你一个实战小清单。下次拿到固件,按这个来:

  1. file firmware.bin — 初步识别
  2. binwalk firmware.bin — 扫描签名
  3. binwalk -Me firmware.bin — 提取所有内容
  4. ls -la _firmware.bin.extracted/ — 查看提取结果
  5. 进入文件系统目录,搜索passwordadminbackdoor等关键词
  6. strings命令分析二进制文件,寻找敏感信息

嗯,这一章的内容就到这里。固件逆向是个实践性很强的领域,光看不动手是学不会的。找个旧路由器,下载它的固件,自己拆一遍——相信我,拆完一个你就全明白了。

核心要点回顾:

  • 固件 = Bootloader + 内核 + 文件系统
  • binwalk是固件分析的瑞士军刀
  • 文件系统里藏着大部分漏洞
  • 加密固件需要先找密钥
  • 动手拆一个固件,胜过读十篇教程

公众号:蓝海资料掘金营,微信deep3321