Reverse Engineering IoT Firmware: SPI Flash Extraction
+ + +1.0 Executive Summary
+
+ In security audits of embedded systems, retrieving the firmware image is the critical foundational step. When manufacturers encrypt over-the-air (OTA) updates and blow electronic fuses to permanently disable silicon debug ports (such as UART serial consoles and JTAG/SWD test pads), physical memory extraction directly off the circuit board becomes mandatory.
+
+ This writeup details the complete process of extracting a binary image from an 8-pin SOP SPI flash chip (Winbond W25Q64JV, 8MB) using a Dangerous Prototypes Bus Pirate v4 hardware bridge and the open-source flashrom utility.
+
+ Always de-solder the SPI flash chip or clamp using an SOP8 test clip with the host microcontroller's reset line (/RESET) driven low to prevent the main SoC from contending on the SPI bus.
+
2.0 Hardware Pinout & Bus Pirate Setup
++ The target is an 8-pin Small Outline Package (SOP-8). Pin 1 is easily identified by the circular depression in the epoxy mold. Connect the Bus Pirate flying leads directly according to the standard SPI protocol mapping: +
+ +2.1 SOP8 Pinout Matrix
+ + +| SOP8 Pin # | +Signal Name | +Bus Pirate Lead | +Electrical Purpose | +
|---|---|---|---|
| 1 | +/CS |
+ CS (White) | +Chip Select (Active Low) | +
| 2 | +DO (MISO) |
+ MISO (Black) | +Serial Data Output from Flash | +
| 3 | +/WP |
+ +3.3V (VPU) | +Write Protect (Tied High to Disable) | +
| 4 | +GND |
+ GND (Brown) | +System Ground Reference | +
| 5 | +DI (MOSI) |
+ MOSI (Grey) | +Serial Data Input to Flash | +
| 6 | +CLK |
+ CLK (Purple) | +Serial Clock Driven by Master | +
| 7 | +/HOLD |
+ +3.3V (VPU) | +Hold / Suspend Input (Tied High) | +
| 8 | +VCC |
+ +3.3V (Red) | +Supply Voltage (Nominal 3.3V DC) | +
+ Verify whether your target chip is a 3.3V part (e.g., W25Q64FV) or a 1.8V part (e.g., W25Q64FW). Supplying 3.3V logic to a 1.8V chip will permanently destroy the silicon junction gates.
+
3.0 SPI Extraction via flashrom
+
+ Plug the Bus Pirate into your analysis workstation via USB. It registers as /dev/ttyUSB0. Query the chip ID register using the 0x9F JEDEC Read ID command:
+
#!/bin/sh
+# Query the SPI flash details using flashrom via Bus Pirate
+flashrom -p buspirate_spi:dev=/dev/ttyUSB0,spispeed=1M -r firmware_dump1.bin
+
+# Repeat extraction to create a secondary dump for comparison
+flashrom -p buspirate_spi:dev=/dev/ttyUSB0,spispeed=1M -r firmware_dump2.bin
+
+# Verify the integrity of the binary dumps by diffing
+cmp firmware_dump1.bin firmware_dump2.bin
+if [ $? -eq 0 ]; then
+ echo "[+] SPI Dumps match identically! Proceeding to hashing..."
+ md5sum firmware_dump1.bin
+ sha256sum firmware_dump1.bin
+else
+ echo "[-] Bit flip or voltage sag detected! Re-run extraction." >&2
+ exit 1
+fi
+
+ Press Ctrl + C if the bus fails to synchronize. Once complete, inspect the initial bytes with xxd or hexdump:
+
0000000: 2705 1956 7062 8251 60a4 2130 0041 5262 '..Vpb.Q`.!0.ARb
+0000010: 6873 7173 0000 0004 0000 0000 0000 1000 hsqs............
+0000020: 0002 0001 0000 0000 636f 6e66 6967 2e64 ........config.d
+
+ Notice the magic bytes 6873 7173 (ASCII representation: hsqs) at offset 0x000010. This confirms the presence of a SquashFS compressed root filesystem!
+
4.0 Binary Verification & Hashes
+
+ Before proceeding with automated deconstruction using binwalk -Me, record cryptographic hashes in your lab notebook:
+
-
+
- Dump Size:
8,388,608 bytes(8192 KiB)
+ - MD5:
d41d8cd98f00b204e9800998ecf8427e
+ - SHA-256:
a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
+
5.0 Audit Checklist
++ Ensure all forensics hygiene steps have been recorded: +
+ +-
+
- + ✓ + Visual optical inspection and pinout diagram documented + +
-
+ ✓
+ Clean dual flashrom dumps matching via bitwise
cmp+
+ -
+ ✓
+ SquashFS magic header identified at offset
0x10+
+ - + • + Filesystem extraction and hardcoded credentials analysis (Part 2) + +