第一章:固件逆向工程导论

大家好,我是你们这门课的主讲人。在嵌入式安全这个行当里摸爬滚打了十几年,我见过太多因为固件漏洞导致设备被攻破的案例。今天咱们就来聊聊固件逆向工程最基础、也最核心的那些事儿。

说实话,很多人一听到「逆向工程」就觉得是黑客干的事。其实不然。我个人的理解是:固件逆向,就是通过分析二进制代码,去理解一个嵌入式设备到底在干什么、怎么干的。说白了,就是给设备做一次「解剖」。

1.1 固件到底是什么?

先问个问题:你拆开一个路由器、智能摄像头或者工控PLC,里面那块芯片里装的是什么?

嗯,就是固件。固件是固化在硬件中的软件,它直接操作硬件寄存器、控制外设、处理通信协议。跟PC上的应用程序不同,固件通常没有操作系统,或者只有个轻量级的RTOS。

我在一次项目中遇到过一台老式的工业PLC,它的固件竟然是用汇编写的,连个main函数都没有。你想想看,这种代码逆向起来有多酸爽。

固件的典型组成:

  • Bootloader:引导加载程序,负责初始化硬件并加载主固件
  • 内核/RTOS:实时操作系统或裸机调度器
  • 驱动程序:外设控制代码(UART、SPI、I2C、GPIO等)
  • 应用程序:实现设备具体功能的逻辑
  • 文件系统:存储配置、日志、证书等数据

1.2 逆向工程的伦理与法律

这里我必须强调一点:逆向工程本身不是违法的,但你怎么用这个能力,决定了你的屁股坐在哪边。

我曾经帮一家安全公司做固件审计,客户明确要求「只要能找到漏洞,怎么逆向都行」。但我也见过有人把逆向出来的私钥拿去伪造设备固件更新——嗯,那哥们后来进去了。

避坑指南:

我曾经接手过一个项目,客户要求逆向竞争对手的固件。我直接拒绝了。因为根据《计算机软件保护条例》,未经授权逆向他人软件用于商业竞争,属于侵权行为。记住:

  • ✅ 可以逆向自己购买的设备
  • ✅ 可以逆向用于安全研究(需遵循负责任的披露)
  • ❌ 不可以逆向用于破解、盗版或商业抄袭
  • ❌ 不可以将逆向成果用于恶意攻击

1.3 常见嵌入式架构概述

做固件逆向,你得先认识芯片的「语言」。目前市面上主流的嵌入式架构就三种:ARM、MIPS、RISC-V。我按自己的经验给你捋一捋。

架构 特点 常见设备 逆向难度
ARM 32/64位,Thumb/Thumb-2指令集,大小端可切换 手机、路由器、IoT设备 中等(资料多)
MIPS 32/64位,延迟槽,固定指令长度(4字节) 家用路由器、交换机 较高(延迟槽坑多)
RISC-V 开源,模块化,可扩展 新兴IoT、AI加速器 较低(但工具链不成熟)

我个人习惯用ARM作为入门架构,因为它的文档最全、工具链最成熟。MIPS的延迟槽是个大坑——你反汇编出来的指令顺序跟实际执行顺序可能不一样,我第一次逆向MIPS固件时就被这个坑惨了。

1.4 固件获取方法

没有固件,逆向就是无米之炊。获取固件的方法有很多,我按从易到难的顺序给你排个序。

1.4.1 从芯片拆解获取

最直接的方法:把芯片拆下来,用热风枪吹掉封装,然后用显微镜看die。但说实话,这方法太暴力了,我一般只在实在没办法的时候才用。

有一次我遇到一个加密芯片,所有通信接口都被熔断了。没办法,只能拆芯片、去封装、用探针台直接读Flash。那活儿干了一整天,眼睛都快瞎了。

1.4.2 通过JTAG/SWD接口

这是我最推荐的方法。JTAG和SWD是芯片的调试接口,通过它们可以直接读取Flash内容、单步调试、甚至修改内存。

实用技巧:

我建议你准备一个J-Link或者OpenOCD。连接目标板时,先测一下TCK、TMS、TDI、TDO这四个引脚的电压。如果某个引脚被拉高或拉低,说明芯片可能锁了调试接口。

# 使用OpenOCD读取Flash
openocd -f interface/jlink.cfg -f target/stm32f4x.cfg
> flash read_bank 0 firmware.bin 0x08000000 0x100000
> exit

1.4.3 通过Bootloader提取

很多芯片的Bootloader会提供固件更新功能。如果能进入Bootloader模式,就可以通过UART或USB把固件dump出来。

我记得有一次逆向一台工业路由器,它的Bootloader有个隐藏菜单:按住复位键再上电,串口就会输出「Press X to enter recovery mode」。输入X后,直接就能用Ymodem协议下载固件。嗯,这种设计其实挺常见的。

Bootloader提取步骤:

  1. 确定进入Bootloader的方式(按键、跳线、特定串口数据)
  2. 连接UART(通常波特率115200或57600)
  3. 发送特定命令进入固件下载模式
  4. 使用工具(如Xmodem、TFTP)读取固件

本章知识体系

下面这张图是我自己画的,把本章的核心逻辑串起来了。你一看就明白。

固件逆向工程导论 固件定义 伦理与法律 常见架构 固件获取方法 芯片拆解 JTAG/SWD Bootloader提取 其他方法 ARM MIPS RISC-V

嗯,这张图把本章的四个核心模块串起来了。你从中心出发,沿着分支往下走,就能理清固件逆向的入门路径。

我的建议:

刚开始学固件逆向,别急着上手拆芯片。先找个现成的固件文件(比如从官网下载的路由器固件),用binwalk解包看看里面有什么。等你熟悉了文件结构,再考虑用JTAG读Flash。一步一步来,别贪快。


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