คลัง
iot

SPI Flash Dump

SPI Flash Dump คือการอ่าน firmware ตรงจากชิป flash (SPI NOR) บน PCB เมื่อไม่มี firmware จากแหล่งอื่น ผ่าน programmer ราคาถูก (CH341A) + SOIC clip บทนี้ลงลึกการระบุชิป, การต่อ (in-circuit vs ถอดชิป), flashrom, การ verify dump, และการ extract ต่อ (เนื้อหาเพื่อฝึกใน lab/CTF/อุปกรณ์ที่ได้รับอนุญาต)

Advanced#spi#flash#iot#hardware#flashrom#ch341a#ctf

1. ทำไมต้อง dump flash ตรง

เมื่อหา firmware จากเว็บผู้ผลิตไม่ได้ และ UART/JTAG ไม่ให้ dump (หรือถูกปิด) ทางสุดท้ายคืออ่านตรงจาก ชิป SPI flash บน PCB (ชิปที่เก็บ firmware ทั้งหมด) ด้วย programmer ราคาถูก (CH341A ~100 บาท) + clip หนีบขาชิป — ได้ firmware ดิบทั้ง chip มา extract ต่อ (ดู Firmware Analysis) ข้อดี: ได้ firmware แน่นอนแม้ vendor ไม่เปิดเผย

เนื้อหานี้เพื่อการศึกษาและฝึกในสภาพแวดล้อมที่ได้รับอนุญาต (CTF, lab, อุปกรณ์ของตัวเอง) เท่านั้น

2. ระบุชิป SPI flash

  • มองหาชิป 8 ขา (SOIC-8) บน PCB — มัก marking เช่น 25Q64, W25Q128, MX25L..., GD25...
  • อ่าน part number บนชิป → google datasheet → รู้ขนาด (Q64=64Mbit=8MB, Q128=128Mbit=16MB) + pinout + voltage (มัก 3.3V)
  • pinout มาตรฐาน SOIC-8 SPI: pin1=CS, 2=DO(MISO), 3=WP, 4=GND, 5=DI(MOSI), 6=CLK, 7=HOLD, 8=VCC — มี dot/notch บอก pin 1
  • ชิปแบบอื่น: SOIC-16 (ขนาดใหญ่), WSON/QFN (ไม่มีขายื่น ต้องถอด), BGA (ต้อง reball — ยาก)
  • flashrom รู้จักชิปอัตโนมัติตอน probe (ถ้า support)
ชิปที่เจอบ่อยใน IoT คือ Winbond W25Qxx series (SOIC-8) — flashrom รองรับเกือบหมด; อ่าน marking บนชิปแล้ว google datasheet ยืนยันขนาด/pinout/voltage ก่อนต่อ

3. การต่อ (in-circuit vs ถอดชิป)

มี 2 วิธี: in-circuit (หนีบขณะชิปยังอยู่บน board) — ง่าย ไม่ต้องบัดกรี ใช้ SOIC clip หนีบ; หรือ ถอดชิปออก (hot air) แล้วใส่ socket — ชัวร์กว่าแต่ยุ่งกว่า

ต่อ CH341A + SOIC clipLinux
# อุปกรณ์: CH341A programmer + SOIC-8 clip (pomona/cheap clip)
# 1. หนีบ clip บนชิป (จัด pin 1 ให้ตรง — ดู dot บนชิป + clip)
# 2. เสียบ clip เข้า CH341A ตาม pinout (pin1=CS อยู่ฝั่งเดียวกัน)
# 3. เสียบ CH341A เข้า USB

# *** in-circuit: ปลดไฟอุปกรณ์ (ถอดปลั๊ก) ***
# บางบอร์ด in-circuit ไม่ได้ (chip อื่น hold bus) → ต้องถอดชิป
# หรือยก WP/HOLD, ตัดไฟ SoC

# ตรวจว่า CH341A เจอ
lsusb | grep -i 1a86      # CH341 chipset
flashrom -p ch341a_spi    # probe (ไม่ระบุ chip = ดูว่าเจออะไร)
in-circuit ง่ายสุด (ปลดไฟอุปกรณ์ก่อน); ถ้า probe ไม่เจอ/ค่ามั่ว = chip อื่นบน bus รบกวน → ถอดชิปหรือ isolate; จัด pin 1 ให้ตรง (สำคัญมาก)

4. Dump ด้วย flashrom

flashrom read + verifyLinux
# probe ให้ flashrom ระบุชิป
flashrom -p ch341a_spi
# เห็นชื่อชิป เช่น "W25Q64.V"; ถ้าเจอหลายตัวให้ระบุ -c

# อ่าน (dump) — ทำ 2-3 ครั้งแล้วเทียบ (ยืนยันว่าอ่านนิ่ง)
flashrom -p ch341a_spi -c "W25Q64.V" -r dump1.bin
flashrom -p ch341a_spi -c "W25Q64.V" -r dump2.bin
flashrom -p ch341a_spi -c "W25Q64.V" -r dump3.bin

# verify dump ตรงกันทุกครั้ง (สำคัญ — clip หลวมทำให้อ่านเพี้ยน)
md5sum dump1.bin dump2.bin dump3.bin
# ถ้า hash ตรงกัน = dump ดี; ไม่ตรง = clip หลวม/สัมผัสไม่ดี → หนีบใหม่

# ดู dump
binwalk dump1.bin        # ควรเห็น partition/filesystem
file dump1.bin
อ่านหลายครั้งแล้วเทียบ md5 — hash ไม่ตรง = clip สัมผัสไม่ดี (หนีบใหม่/กดให้แน่น); -c ระบุชิปถ้า probe เจอหลายตัว

5. หลัง dump + เขียนกลับ

  • extract: dump ที่ได้คือ firmware ดิบ → binwalk -Me dump.bin แกะต่อ (ดู Firmware Analysis)
  • หา offset: ถ้า binwalk ไม่เห็น filesystem ชัด → ดู entropy, ลอง offset ต่างๆ (บาง flash มี config/nvram ปนด้วย)
  • เขียนกลับ (modify firmware): flashrom -p ch341a_spi -w modified.bin — แก้ firmware แล้ว flash กลับ (เช่น แก้ config, ใส่ backdoor ในงานวิจัย, unbrick)
  • backup ก่อนเขียนเสมอ: เก็บ dump เดิมไว้ — เขียนพลาดอาจ brick อุปกรณ์
  • NAND flash ต่างจาก NOR: NAND (ใหญ่กว่า, มี OOB/ECC) ต้อง tool/วิธีต่างกัน — หัวข้อนี้เน้น SPI NOR (พบบ่อยใน IoT เล็ก)
การเขียน (write) flash เสี่ยง brick — backup dump เดิมไว้เสมอ และยืนยัน image ก่อนเขียน; การอ่าน (read) ปลอดภัย ไม่กระทบอุปกรณ์

6. เครื่องมือทางเลือก

เครื่องมือลักษณะ
CH341A + SOIC clipถูกสุด (~100-200฿), นิยมสุด, 3.3V (ระวังรุ่น 5V)
Bus Pirateอเนกประสงค์ (SPI/I2C/UART), flashrom support
FT2232Hเร็ว, ใช้กับ flashrom/OpenOCD ได้
Raspberry Piใช้ GPIO + flashrom (linux_spi) dump ได้
XGecu T48/TL866programmer ครอบจักรวาล, รองรับชิปเยอะ
CH341A หลายรุ่นจ่าย 5V บน data line (ออกแบบมาเดิม) แต่ SPI flash ส่วนใหญ่ 3.3V — ต่อตรงอาจทำชิปเสีย; ใช้รุ่น 3.3V mod หรือ level shifter เพื่อความปลอดภัย

7. Quick Reference

  • อ่าน firmware ตรงจากชิป SPI flash เมื่อหาจากแหล่งอื่นไม่ได้
  • ระบุชิป: SOIC-8 marking (W25Q64=8MB), datasheet, pin1=CS
  • ต่อ: CH341A + SOIC clip, in-circuit (ปลดไฟ), จัด pin 1 ตรง
  • dump: flashrom -p ch341a_spi -c CHIP -r dump.bin (อ่านหลายครั้งเทียบ md5)
  • extract: binwalk -Me dump.bin (ดู Firmware Analysis)
  • write เสี่ยง brick — backup เสมอ; CH341A ระวัง 5V (ใช้ 3.3V)

🧭 จับมือทำทีละขั้น (มีแค่ Kali) + ถ้าติดไปไหนต่อ

สมมติหา firmware จากเว็บผู้ผลิตไม่ได้เลย และ UART ก็ไม่ให้ dump มีแค่เครื่อง Kali + CH341A programmer — ทำตามนี้ทีละขั้นเพื่ออ่าน firmware ตรงจากชิป

  1. 1เปิดฝาอุปกรณ์ หาชิป 8 ขา (SOIC-8) บน PCB — มัก marking เช่น 25Q64, W25Q128
  2. 2อ่าน part number บนชิปแล้ว google หา datasheet ยืนยันขนาด/pinout/voltage (มัก 3.3V)
  3. 3จัด SOIC clip ให้ pin 1 ตรงกับ dot บนชิว แล้วเสียบเข้า CH341A
  4. 4ปลดปลั๊กไฟอุปกรณ์ก่อน แล้วเสียบ CH341A เข้า USB คอมพิวเตอร์
  5. 5เช็คว่าเจอ device: lsusb | grep -i 1a86
  6. 6probe ให้ flashrom ระบุชิป: flashrom -p ch341a_spi — ควรเห็นชื่อชิป เช่น W25Q64.V
  7. 7dump 2-3 ครั้ง: flashrom -p ch341a_spi -c "W25Q64.V" -r dump1.bin (ทำซ้ำเป็น dump2.bin, dump3.bin)
  8. 8เทียบว่า dump ตรงกันทุกครั้ง: md5sum dump1.bin dump2.bin dump3.bin — hash ต้องตรงกันหมด
  9. 9เมื่อ dump ดีแล้ว extract ต่อ: binwalk -Me dump1.bin
ต้อง dump flash ตรงจากชิป — ไล่ทีละขั้น
หาชิป SOIC-8 บน PCB
✅ เจอชิป มี marking ชัดเจน→ อ่าน datasheet + เตรียมต่อ
❌ ไม่เจอชิป SPI ธรรมดา (WSON/BGA/ไม่มี marking)→ ยากขึ้นมาก ลอง UART/JTAG แทน
ต่อ CH341A + SOIC clip (in-circuit, ปลดไฟก่อน)
lsusb | grep -i 1a86
✅ lsusb เจอ CH341→ probe ด้วย flashrom
❌ lsusb ไม่เจอ device→ เช็คสาย USB/driver อีกรอบ
probe หา chip ด้วย flashrom
flashrom -p ch341a_spi
✅ ระบุชิปได้ (เช่น W25Q64.V)→ dump ต่อ
❌ probe ไม่เจอ/ค่ามั่ว→ ชิปอื่นบน bus รบกวน (in-circuit ไม่ได้)
ถอดชิปออกด้วย hot air แล้วใส่ socket
✅ probe ผ่านหลังถอด→ dump ต่อ
❌ ยังมีปัญหา (pin1 ผิด/ชิปเสีย)→ ตรวจ pinout/voltage อีกรอบ
dump 2-3 ครั้งแล้วเทียบ md5
flashrom -r dump.bin
✅ md5 ตรงกันทุกครั้ง→ extract ต่อ
❌ hash ไม่ตรงกัน→ clip หลวม/สัมผัสไม่ดี → หนีบใหม่แล้ว dump ซ้ำ
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
ระบุชิป/หา datasheet--google + ชื่อ part number (หา datasheet PDF)
ต่อ programmer-ซื้อ CH341A + SOIC-8 clip (~100-200฿)-
probe/dump flashflashrom--
ตรวจ dump ถูกต้อง/ซ้ำmd5sum--
extract firmware ที่ dump ได้binwalk--
ถอดชิป (ถ้า in-circuit ไม่ได้)-hot air rework station-
ทางเลือก programmer อื่น-Bus Pirate / FT2232H / XGecu T48/TL866-
🚑 ถ้าตันสนิท ลองท่าถัดไป: Firmware Analysis — ทันทีที่ dump ได้ ไป extract/ขุด secret ต่อ; UART & JTAG — ถ้า SPI ต่อยากเกินไป (BGA/WSON) ลองหา debug interface อื่นบน board; Firmware Emulation — รัน firmware ที่ dump ได้เพื่อดู runtime; ถ้าเขียนกลับพลาดจน brick ก็ใช้ dump ที่ backup ไว้เขียนคืนได้

โน้ตของฉัน

ยังไม่มีโน้ตสำหรับหัวข้อนี้