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/อุปกรณ์ที่ได้รับอนุญาต)
1. ทำไมต้อง dump flash ตรง
เมื่อหา firmware จากเว็บผู้ผลิตไม่ได้ และ UART/JTAG ไม่ให้ dump (หรือถูกปิด) ทางสุดท้ายคืออ่านตรงจาก ชิป SPI flash บน PCB (ชิปที่เก็บ firmware ทั้งหมด) ด้วย programmer ราคาถูก (CH341A ~100 บาท) + clip หนีบขาชิป — ได้ firmware ดิบทั้ง chip มา extract ต่อ (ดู Firmware Analysis) ข้อดี: ได้ firmware แน่นอนแม้ vendor ไม่เปิดเผย
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)
W25Qxx series (SOIC-8) — flashrom รองรับเกือบหมด; อ่าน marking บนชิปแล้ว google datasheet ยืนยันขนาด/pinout/voltage ก่อนต่อ3. การต่อ (in-circuit vs ถอดชิป)
มี 2 วิธี: in-circuit (หนีบขณะชิปยังอยู่บน board) — ง่าย ไม่ต้องบัดกรี ใช้ SOIC clip หนีบ; หรือ ถอดชิปออก (hot air) แล้วใส่ socket — ชัวร์กว่าแต่ยุ่งกว่า
# อุปกรณ์: 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 = ดูว่าเจออะไร)4. Dump ด้วย flashrom
# 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.bin5. หลัง 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 เล็ก)
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/TL866 | programmer ครอบจักรวาล, รองรับชิปเยอะ |
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เปิดฝาอุปกรณ์ หาชิป 8 ขา (SOIC-8) บน PCB — มัก marking เช่น
25Q64,W25Q128 - 2อ่าน part number บนชิปแล้ว google หา datasheet ยืนยันขนาด/pinout/voltage (มัก 3.3V)
- 3จัด SOIC clip ให้ pin 1 ตรงกับ dot บนชิว แล้วเสียบเข้า CH341A
- 4ปลดปลั๊กไฟอุปกรณ์ก่อน แล้วเสียบ CH341A เข้า USB คอมพิวเตอร์
- 5เช็คว่าเจอ device:
lsusb | grep -i 1a86 - 6probe ให้ flashrom ระบุชิป:
flashrom -p ch341a_spi— ควรเห็นชื่อชิป เช่นW25Q64.V - 7dump 2-3 ครั้ง:
flashrom -p ch341a_spi -c "W25Q64.V" -r dump1.bin(ทำซ้ำเป็น dump2.bin, dump3.bin) - 8เทียบว่า dump ตรงกันทุกครั้ง:
md5sum dump1.bin dump2.bin dump3.bin— hash ต้องตรงกันหมด - 9เมื่อ dump ดีแล้ว extract ต่อ:
binwalk -Me dump1.bin
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| ระบุชิป/หา datasheet | - | - | google + ชื่อ part number (หา datasheet PDF) |
| ต่อ programmer | - | ซื้อ CH341A + SOIC-8 clip (~100-200฿) | - |
| probe/dump flash | flashrom | - | - |
| ตรวจ dump ถูกต้อง/ซ้ำ | md5sum | - | - |
| extract firmware ที่ dump ได้ | binwalk | - | - |
| ถอดชิป (ถ้า in-circuit ไม่ได้) | - | hot air rework station | - |
| ทางเลือก programmer อื่น | - | Bus Pirate / FT2232H / XGecu T48/TL866 | - |
หัวข้อที่เชื่อมโยง
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้