第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 -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。我会按以下步骤操作:
- 初步扫描:
binwalk router_fw.bin,看看里面有什么 - 提取文件系统:
binwalk -Me router_fw.bin - 分析文件系统:进入提取出的目录,查看关键文件
- 查找漏洞:搜索硬编码密码、命令注入点、后门
- 逆向Web界面:分析/www目录下的CGI脚本
下面这张图,是我总结的固件逆向整体流程:
在实际操作中,我遇到过最头疼的情况是固件被加密了。厂商把整个固件用AES加密,binwalk扫出来全是乱码。这时候怎么办?
最后,给你一个实战小清单。下次拿到固件,按这个来:
file firmware.bin— 初步识别binwalk firmware.bin— 扫描签名binwalk -Me firmware.bin— 提取所有内容ls -la _firmware.bin.extracted/— 查看提取结果- 进入文件系统目录,搜索
password、admin、backdoor等关键词 - 用
strings命令分析二进制文件,寻找敏感信息
嗯,这一章的内容就到这里。固件逆向是个实践性很强的领域,光看不动手是学不会的。找个旧路由器,下载它的固件,自己拆一遍——相信我,拆完一个你就全明白了。
核心要点回顾:
- 固件 = Bootloader + 内核 + 文件系统
- binwalk是固件分析的瑞士军刀
- 文件系统里藏着大部分漏洞
- 加密固件需要先找密钥
- 动手拆一个固件,胜过读十篇教程