iT邦幫忙

2026 iThome 鐵人賽

DAY 22
0
Security

Like an Exploition:IoT 韌體漏洞鍊成術系列 第 22 篇

【𝕯𝖆𝖞 𝟐𝟐】初探硬體測試

  • 分享至 

  • xImage
  •  

前言

前面幾天的韌體取得、解包與分析,大多可以直接在電腦上完成。當公開韌體不足、需要觀察開機流程、取得 runtime 狀態,或必須直接讀取裝置上的儲存內容時,會需要進入硬體測試。

常見方法主要有:

  • UART
  • JTAG
  • SPI Flash 直接讀取
  • Logic Analyzer

這篇整理各方法適用的情境、可以取得的資訊,以及常用工具。

0x01 UART

UART 是嵌入式設備最常見的 debug interface 之一,常被用來輸出 bootloader、kernel 與 userspace 的啟動資訊。

常見用途

  • 取得 boot log
  • 確認 bootloader 環境
  • 查看 kernel command line
  • 查看 Flash / DRAM 資訊
  • 中斷 U-Boot autoboot

調適設備

image.png
工具的話最基礎的是 USBtoTTL 的設備,約 $100 台幣,也是最容易取得的入門設備
如上圖顯示,TX和RX分別相反接入到設備的RX和TX,一般情況下不需要接 VCC。

接著需要接上 Putty 軟體並且設定好 boude rate(紅框處),並開始監聽(會跳出一個互動式 cmd)
image.png

可以取得的資訊

典型 boot log:

U-Boot 1.1.3

DRAM: 128 MB
Flash: 16 MB

Loading kernel...
Starting kernel...

Linux version 3.x.x

這些資訊可以協助確認:

CPU architecture
Bootloader
Kernel version
Memory size
Flash size
MTD partition
Root filesystem
Kernel command line

0x02 JTAG

JTAG 可以直接控制處理器或 debug unit,適合需要觀察 runtime 狀態的情況。

常見用途

  • runtime debugging
  • dump RAM
  • dump Flash
  • 查看 register
  • 設 breakpoint
  • 分析 bootloader
  • 追蹤難以從靜態分析確認的控制流

常見腳位

典型 JTAG:

TCK
TMS
TDI
TDO
GND
VREF

有些 target 還會出現:

TRST
SRST

ARM Cortex 常見另一種介面:

SWDIO
SWCLK
GND
VREF

也就是 SWD。

基本流程

確認 debug header
        ↓
確認 GND / VREF
        ↓
確認 JTAG / SWD pin
        ↓
連接 debugger
        ↓
OpenOCD / vendor debugger
        ↓
halt CPU
        ↓
memory / register / breakpoint

完成設定後,可以透過:

OpenOCD
   │
   └── GDB

進行 debug。

Runtime dump

例如:

0x80000000 ────────────
             RAM
0x88000000 ────────────

可以直接 dump:

RAM
bootloader
mapped flash
runtime structures

之後再使用靜態工具分析

電壓

連接 debugger 前應先量測 target I/O voltage。

常見:

1.8 V
2.5 V
3.3 V

VREF 用來讓 debugger 確認 target logic level。

常見工具

工具 用途
JTAGulator 自動探索 JTAG / UART pin
SEGGER J-Link ARM / RISC-V 等目標 debug
STLINK-V3SET STM32 / STM8 debug
Bus Blaster V4 FTDI-based JTAG
Tigard JTAG / UART / SPI
Glasgow 多協定介面

0x03 SPI Flash 直接讀取

許多 Router、Camera、Gateway 與 Embedded Linux 裝置會使用 SPI NOR Flash 儲存:

Bootloader
Kernel
RootFS
Configuration
Calibration data
Factory partition

常見晶片封裝:

SOIC8
WSON8
TSOP

SOIC8 通常最方便處理。

常見用途

  • 官方沒有 firmware
  • 需要完整 Flash image
  • bootloader 無法正常啟動
  • firmware update package 與實際 Flash layout 不同
  • 需要 factory partition
  • 需要校正資料或 device-specific configuration

常見晶片

例如:

Winbond W25Q64
Winbond W25Q128
MXIC MX25L128
GD25Q128

其中:

W25Q64  = 64 Mbit = 8 MB
W25Q128 = 128 Mbit = 16 MB

CH341A + SOIC8 Clip

最常見的低成本組合:

CH341A
   │
SOIC8 Clip
   │
SPI NOR

Linux 可以搭配:

flashrom

先探測:

flashrom -p ch341a_spi

讀取:

flashrom -p ch341a_spi -r firmware_dump.bin

可以重複讀取,並且驗證他們的 SHA-256 雜湊值,觀察是否一致。有時候會有掉包的風險。

0x04 Logic Analyzer

Logic Analyzer 用來觀察 digital signal。

在硬體研究中常用於:

UART
SPI
I2C
CAN
GPIO
proprietary digital protocol

找 UART

如果 PCB 上有多個未知 test point:

TP1
TP2
TP3
TP4
TP5

可以同時接入 Logic Analyzer。

重新開機後觀察:

idle
burst traffic
repeating digital signal

UART TX 在 boot 過程通常會出現大量 burst。

搭配 protocol decoder 後,可以測試:

9600
38400
57600
115200

找 SPI

SPI 常見四條主要訊號:

CLK
CS
MOSI
MISO

Logic Analyzer 可以直接觀察:

clock
chip select
command
address
data

例如 CPU 開機時讀取 SPI Flash:

CS  ────┐      ┌─────
        └──────┘

CLK     _|‾|_|‾|_|‾|_

MOSI    CMD + ADDRESS

MISO    DATA

可以進一步判斷:

Flash 型號
讀取位址
command sequence
boot-time Flash access

找 I2C

I2C:

SCL
SDA

可以直接 decode:

Address
Read / Write
ACK
Data

常見周邊:

EEPROM
sensor
RTC
PMIC
secure element

常見工具

工具 用途
Saleae Logic Pro 16 多通道分析與 protocol decode
入門 8ch 24 MHz Logic Analyzer UART / SPI / I2C 基本分析

0x05 腳位探索

拿到未知 PCB 時,第一步通常是確認:

GND
VCC / VREF
UART
JTAG / SWD
SPI
I2C

GND

Multimeter continuity mode:

test point
   │
   └── PCB ground plane / shielding

有 continuity 的 pin 很可能是 GND。

電壓

設備開機後量測:

0 V
1.8 V
3.3 V
5 V

可以協助判斷:

GND
VCC
logic level
idle signal

UART TX

UART TX 通常:

idle = high
boot = burst

可以用:

Oscilloscope
Logic Analyzer

確認。

JTAG

如果有大量 test point,可以使用 JTAGulator 自動嘗試:

TCK
TMS
TDI
TDO

排列組合。

若成功,可能讀到:

IDCODE
Boundary Scan information
TAP chain

0x06 工具總表

Debug Interface

工具 UART JTAG/SWD SPI I2C
CH340G / CP2102 ✓
Tigard ✓ ✓ ✓ ✓
Bus Pirate 5 ✓ 部分 ✓ ✓
Glasgow ✓ ✓ ✓ ✓
J-Link ✓
STLINK-V3SET ✓
Bus Blaster V4 ✓

Discovery / Measurement

工具 用途
Multimeter continuity、voltage
Logic Analyzer UART / SPI / I2C / digital bus
Saleae Logic Pro 16 多通道 protocol analysis
JTAGulator JTAG / UART pin discovery
Oscilloscope voltage、timing、signal integrity

Memory / Flash

工具 用途
CH341A SPI NOR
XGecu T76 NOR / NAND / EEPROM 等
SOIC8 Clip In-system Flash access
flashrom Flash detection / read / write

輔助設備

工具 用途
PCBite Probe holder
Omnifixo PCB / probe 固定
Fine probe test point 接觸
SOIC clip Flash 夾取
Dupont wire 接線

0x07 方法選擇

需求 方法
查看 boot log UART
確認 U-Boot UART
取得 bootloader shell UART
查看 runtime memory JTAG / SWD
breakpoint / single-step JTAG / SWD
dump SPI NOR SPI programmer
找 UART pin Logic Analyzer / Multimeter
找 JTAG pin JTAGulator
分析 SPI / I2C traffic Logic Analyzer
官方沒有 firmware Flash dump
取得 factory partition Flash dump

實務上通常會組合多種方法。

例如:

Multimeter
   ↓
找到 GND / 電壓

Logic Analyzer
   ↓
找到 UART

UART
   ↓
取得 boot log / Flash size

SPI Dump
   ↓
取得 firmware.bin

binwalk / Ghidra
   ↓
靜態分析

或:

UART
 ↓
發現 JTAG / memory map 資訊

JTAG
 ↓
runtime debugging

GDB
 ↓
確認漏洞控制流

上一篇
【𝕯𝖆𝖞 𝟐𝟏】Patch Diffing
系列文
Like an Exploition:IoT 韌體漏洞鍊成術 共 22 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言