คลัง
iot

UART & JTAG

UART และ JTAG เป็น hardware debug interface บน PCB ที่ให้เข้าถึง serial console (มัก root shell) และ debug CPU/dump memory ตามลำดับ บทนี้ลงลึกการหา/ระบุ pinout, การต่อ USB-TTL adapter, การหา baud rate, การเข้า bootloader/shell ผ่าน UART, และ JTAG ผ่าน OpenOCD (เนื้อหาเพื่อฝึกใน lab/CTF/อุปกรณ์ที่ได้รับอนุญาต)

Advanced#uart#jtag#iot#hardware#serial#debug#ctf

1. UART vs JTAG

บน PCB ของอุปกรณ์ IoT มักมี debug interface ที่ผู้ผลิตใช้ตอนพัฒนาแต่ไม่ได้ถอดออก: UART (serial console) ให้เข้าถึง boot log + มักroot shellโดยตรง (ง่ายและให้ผลเร็วสุด); JTAG ให้ debug CPU ระดับ hardware — หยุด/อ่าน register, dump/เขียน memory และ flash (ทรงพลังกว่าแต่ซับซ้อนกว่า) ทั้งคู่เป็น physical access — ต้องมีอุปกรณ์จริงในมือ

UART 4 pin บน PCB + การต่อ USB-TTL
PCB — UART header (4 pin) G V TX RX GND VCC* TXD RXD USB-TTL adapter (FT232 / CP2102, 3.3V) GND ↔ GND TX → RX (cross!) RX ← TX (cross!) * อย่าต่อ VCC — จ่ายไฟจากอุปกรณ์เอง; ต่อแค่ GND/TX/RX (TX↔RX ไขว้งกัน)
เนื้อหานี้เพื่อการศึกษาและฝึกในสภาพแวดล้อมที่ได้รับอนุญาต (CTF, lab, อุปกรณ์ของตัวเอง) เท่านั้น; ระวังแรงดัน 3.3V vs 5V — ต่อผิดอาจทำอุปกรณ์เสีย

2. หาและระบุ UART pinout

  • มองหา header 4 pin (หรือ 4 จุด pad) บน PCB — มัก label UART/J1/CON; pin คือ GND, VCC, TX, RX
  • multimeter ระบุ pin: GND = ต่อเนื่องกับ ground plane (continuity); VCC = ~3.3V คงที่ (เทียบ GND); TX = แรงดันกระเพื่อมตอน boot (ส่ง data); RX = แรงดันคงที่ pull-up
  • logic analyzer: ต่อทุก pin ตอน boot → ดู pin ที่มี data = TX; วัด timing หา baud
  • ดู datasheet ของ SoC: หา UART pin ของชิป แล้วไล่ trace บน PCB
  • JTAGulator: เครื่องมือ auto-detect UART/JTAG pinout จาก pad ที่ไม่รู้
ลำดับหา pin เร็วๆ: GND ก่อน (continuity กับ ground) → VCC (3.3V คงที่) → TX (กระเพื่อมตอน boot, ใช้ logic analyzer/scope) → RX (ที่เหลือ); ไม่ต่อ VCC ใช้ไฟอุปกรณ์เอง

3. ต่อและเข้า UART console

ต่อ USB-TTL + หา baud + เข้า consoleLinux
# ต่อ: adapter GND->PCB GND, adapter RX->PCB TX, adapter TX->PCB RX
# (ไขว้ TX/RX; adapter 3.3V; ไม่ต่อ VCC)

# หา device (มัก /dev/ttyUSB0)
dmesg | grep tty
ls /dev/ttyUSB*

# เปิด serial console (ลอง baud ทั่วไป: 115200 ก่อน)
screen /dev/ttyUSB0 115200
# หรือ
picocom -b 115200 /dev/ttyUSB0
minicom -D /dev/ttyUSB0 -b 115200

# baud ที่พบบ่อย: 115200, 57600, 38400, 9600
# ถ้าได้อักขระมั่ว = baud ผิด → ลองค่าอื่น
# baudrate.py (devttys0) ช่วยเดา baud จาก output

# ตอน boot จะเห็น U-Boot log + kernel boot
# มักได้ root shell ตอน boot เสร็จ (หรือกด Enter)
ไขว้ TX/RX; เริ่ม baud 115200; อักขระมั่ว=baud ผิด; ออกจาก screen: Ctrl+A K; picocom: Ctrl+A Ctrl+X

4. สิ่งที่ทำได้ผ่าน UART

  • root shell ทันที: หลาย device ให้ root shell ตอน boot เสร็จโดยไม่ต้อง login — เข้าถึง filesystem เต็ม
  • หยุดที่ U-Boot: กดปุ่ม (มัก Enter/space/Ctrl+C) ตอน boot → เข้า bootloader prompt
  • แก้ boot args: ใน U-Boot เปลี่ยน bootargs เพิ่ม init=/bin/sh → bypass login ได้ root
  • dump firmware: U-Boot command (md, sf read) อ่าน flash/memory ออกมาทาง serial
  • ดู boot process: เห็น service ที่รัน, error, debug info
  • password recovery: single-user mode → reset password
bypass login ผ่าน U-BootLinux
# กดปุ่มหยุดตอน boot → เข้า U-Boot prompt (=>)
# ดู env เดิม
printenv
# แก้ bootargs เพิ่ม init=/bin/sh (bypass login → root)
setenv bootargs 'console=ttyS0,115200 root=/dev/mtdblock2 init=/bin/sh'
boot
# → ได้ root shell ไม่ต้อง login

# dump flash ผ่าน U-Boot (อ่าน SPI flash เข้า RAM แล้ว dump)
sf probe
sf read 0x80000000 0x0 0x800000     # อ่าน 8MB จาก flash เข้า RAM
md 0x80000000                        # dump ออกทาง serial (ช้า)
init=/bin/sh ใน bootargs = bypass login ได้ root (เทคนิคคลาสสิก); U-Boot sf/md dump flash ได้แต่ช้า (SPI dump ตรงเร็วกว่า)

5. JTAG (OpenOCD)

JTAG ให้ debug CPU ระดับ hardware — ใช้เมื่อ UART ไม่มี/ถูกปิด หรือต้องการ dump memory/flash, set breakpoint, อ่าน register ต้องมี JTAG adapter (J-Link, FT2232, Bus Blaster) + OpenOCD

OpenOCDLinux
# pinout JTAG: TCK, TMS, TDI, TDO, (TRST), GND
# หา pinout ด้วย JTAGulator ถ้าไม่รู้

# เริ่ม OpenOCD (เลือก config ตาม adapter + target)
openocd -f interface/ftdi/ft2232h.cfg -f target/<soc>.cfg

# เชื่อมผ่าน telnet (อีก terminal)
telnet localhost 4444
> halt                    # หยุด CPU
> reg                     # อ่าน register
> mdw 0x80000000 16       # dump memory (word)
> dump_image fw.bin 0x0 0x800000   # dump flash/memory เป็นไฟล์
> flash write_image ...   # เขียน flash (ระวัง!)

# debug ด้วย gdb ผ่าน OpenOCD (port 3333)
gdb-multiarch -ex "target remote :3333"
JTAG ทรงพลัง: halt CPU, dump_image (dump flash/mem), gdb debug; ต้องมี adapter + target config; ช้ากว่า SPI dump ตรงสำหรับ flash อย่างเดียว

6. Quick Reference

  • UART = serial console (มัก root shell) — ง่าย/เร็วสุด
  • หา pin: GND(continuity) VCC(3.3V) TX(กระเพื่อม boot) RX; multimeter/logic analyzer/JTAGulator
  • ต่อ: USB-TTL 3.3V, ไขว้ TX/RX, ไม่ต่อ VCC; screen /dev/ttyUSB0 115200
  • U-Boot: setenv bootargs ... init=/bin/sh → bypass login ได้ root
  • JTAG = debug CPU/dump flash; OpenOCD + adapter; halt/dump_image/gdb
  • physical access — ระวัง 3.3V vs 5V (ต่อผิดพัง)

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

สมมติมี PCB ของอุปกรณ์ IoT ในมือ อยากได้ root shell มีแค่เครื่อง Kali + USB-TTL adapter — ทำตามนี้ทีละขั้น ตั้งแต่หา pin จนถึงได้ shell

  1. 1มองหา header 4 pin (หรือ 4 จุด pad) บน PCB — มัก label UART/J1/CON ใกล้ๆ chip หลัก
  2. 2ใช้ multimeter ระบุ pin: GND (continuity กับ ground), VCC (~3.3V คงที่), TX (กระเพื่อมตอน boot), RX (ที่เหลือ)
  3. 3ต่อ USB-TTL adapter: GND↔GND, adapter RX→PCB TX, adapter TX→PCB RX (ไขว้กัน) — ไม่ต่อสาย VCC
  4. 4หา device: dmesg | grep tty แล้ว ls /dev/ttyUSB*
  5. 5เปิด console ด้วย baud มาตรฐานก่อน: screen /dev/ttyUSB0 115200
  6. 6ถ้าเห็นอักขระมั่วๆ ลอง baud อื่น: 57600, 38400, 9600 ตามลำดับ
  7. 7รอดู boot log ทั้งหมด — U-Boot log ตามด้วย kernel boot จนจบ
  8. 8ดูว่าได้ root shell ทันทีไหม (หลาย device ไม่ต้อง login เลย)
  9. 9ถ้าต้อง login และไม่รู้ password: รีบูตแล้วกดปุ่ม (Enter/Space/Ctrl+C) ให้ทันตอน boot เพื่อหยุดที่ U-Boot prompt (=>)
  10. 10ใน U-Boot แก้ bootargs bypass login: setenv bootargs 'console=ttyS0,115200 root=/dev/mtdblock2 init=/bin/sh' แล้ว boot
มี PCB ในมือ — ไล่หา shell ทีละขั้น
หา UART header 4 pin บน PCB
✅ เจอ header/pad ชัดเจน→ ระบุ pin ด้วย multimeter
❌ ไม่เจอ header ชัดเจน→ ใช้ JTAGulator หรือลองทาง JTAG แทน
ระบุ GND/VCC/TX/RX ด้วย multimeter
✅ ระบุครบ 4 pin→ ต่อ USB-TTL
❌ ระบุไม่ชัดเจน→ ใช้ logic analyzer/JTAGulator ช่วยยืนยัน
ต่อ USB-TTL (ไขว้ TX/RX, ไม่ต่อ VCC)
screen /dev/ttyUSB0 115200
✅ เห็น boot log อ่านออก→ ดูว่าได้ root shell อัตโนมัติไหม
❌ อักขระมั่ว/ไม่มีอะไรขึ้น→ ลอง baud rate อื่น
ลอง baud rate อื่น (57600/38400/9600)
✅ เจอ baud ที่ถูกต้อง→ กลับไปดู boot log
❌ ลองครบแล้วยังมั่ว→ อาจต่อ TX/RX สลับ หรือระบุ pin ผิด
ได้ root shell อัตโนมัติตอน boot เสร็จไหม
✅ ได้ shell เลยไม่ต้อง loginจบ — เข้าถึง filesystem เต็มแล้ว
❌ ต้อง login (ไม่รู้ password)→ หยุดที่ U-Boot แทน
หยุดที่ U-Boot ตอน boot (กด Enter/Ctrl+C)
✅ เข้า U-Boot prompt (=>) ได้→ แก้ bootargs bypass login
❌ กดยังไงก็เข้าไม่ได้ (timeout สั้น/ถูกล็อค)→ ลองทาง JTAG แทน
แก้ bootargs ใส่ init=/bin/sh แล้ว boot
setenv bootargs ... init=/bin/sh; boot
✅ ได้ root shellจบ — bypass login สำเร็จ
❌ ยัง error/บูตไม่ผ่าน→ ลองทาง JTAG แทน
ลองทาง JTAG (OpenOCD) แทน UART
หา pin TCK/TMS/TDI/TDO แล้ว openocd + halt/dump_image
✅ เจอ JTAG pin + dump memory/flash ได้→ extract firmware ที่ dump มา
❌ ไม่มี JTAG header เลย / ถูกปิด (fuse blown)→ ทางสุดท้ายคือ dump ชิป SPI flash ตรง
ขั้นตอน/งานเครื่องมือใน Kaliติดตั้งเพิ่ม (ถ้าไม่มี)เครื่องมือออนไลน์
หา/ระบุ UART pinmultimeter (แยกซื้อ)--
เปิด serial consolescreen, minicom, picocom--
หา baud rate ไม่รู้ค่า-git clone devttys0/baudrate (baudrate.py)-
auto-detect pin ที่ไม่รู้จัก-JTAGulator (hardware) หรือ logic analyzer-
debug/dump ผ่าน JTAGopenocd, gdb-multiarch--
ค้นหา pinout ของ SoC--google + ชื่อ SoC (หา datasheet PDF)
extract firmware หลัง dumpbinwalk--
🚑 ถ้าตันสนิท ลองท่าถัดไป: SPI Flash Dump — ถ้าทั้ง UART และ JTAG ใช้ไม่ได้เลย ให้ dump ชิป flash ตรง; Firmware Analysis — ทันทีที่ได้ root shell/dump memory มา ไป extract/ขุด secret ต่อ; Firmware Emulation — ถ้าไม่อยากแตะ hardware อีก ลองรัน firmware ที่ dump ได้ผ่าน QEMU แทน; MQTT & CoAP — ถ้าได้ root shell แล้วเจอ service คุยกับ broker/cloud ให้ทดสอบต่อจากใน device เลย

โน้ตของฉัน

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