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/อุปกรณ์ที่ได้รับอนุญาต)
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 — ต้องมีอุปกรณ์จริงในมือ
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 ที่ไม่รู้
3. ต่อและเข้า UART console
# ต่อ: 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)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
# กดปุ่มหยุดตอน 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 (ช้า)5. JTAG (OpenOCD)
JTAG ให้ debug CPU ระดับ hardware — ใช้เมื่อ UART ไม่มี/ถูกปิด หรือต้องการ dump memory/flash, set breakpoint, อ่าน register ต้องมี JTAG adapter (J-Link, FT2232, Bus Blaster) + OpenOCD
# 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"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มองหา header 4 pin (หรือ 4 จุด pad) บน PCB — มัก label UART/J1/CON ใกล้ๆ chip หลัก
- 2ใช้ multimeter ระบุ pin: GND (continuity กับ ground), VCC (~3.3V คงที่), TX (กระเพื่อมตอน boot), RX (ที่เหลือ)
- 3ต่อ USB-TTL adapter: GND↔GND, adapter RX→PCB TX, adapter TX→PCB RX (ไขว้กัน) — ไม่ต่อสาย VCC
- 4หา device:
dmesg | grep ttyแล้วls /dev/ttyUSB* - 5เปิด console ด้วย baud มาตรฐานก่อน:
screen /dev/ttyUSB0 115200 - 6ถ้าเห็นอักขระมั่วๆ ลอง baud อื่น: 57600, 38400, 9600 ตามลำดับ
- 7รอดู boot log ทั้งหมด — U-Boot log ตามด้วย kernel boot จนจบ
- 8ดูว่าได้ root shell ทันทีไหม (หลาย device ไม่ต้อง login เลย)
- 9ถ้าต้อง login และไม่รู้ password: รีบูตแล้วกดปุ่ม (Enter/Space/Ctrl+C) ให้ทันตอน boot เพื่อหยุดที่ U-Boot prompt (
=>) - 10ใน U-Boot แก้ bootargs bypass login:
setenv bootargs 'console=ttyS0,115200 root=/dev/mtdblock2 init=/bin/sh'แล้วboot
| ขั้นตอน/งาน | เครื่องมือใน Kali | ติดตั้งเพิ่ม (ถ้าไม่มี) | เครื่องมือออนไลน์ |
|---|---|---|---|
| หา/ระบุ UART pin | multimeter (แยกซื้อ) | - | - |
| เปิด serial console | screen, minicom, picocom | - | - |
| หา baud rate ไม่รู้ค่า | - | git clone devttys0/baudrate (baudrate.py) | - |
| auto-detect pin ที่ไม่รู้จัก | - | JTAGulator (hardware) หรือ logic analyzer | - |
| debug/dump ผ่าน JTAG | openocd, gdb-multiarch | - | - |
| ค้นหา pinout ของ SoC | - | - | google + ชื่อ SoC (หา datasheet PDF) |
| extract firmware หลัง dump | binwalk | - | - |
โน้ตของฉัน
ยังไม่มีโน้ตสำหรับหัวข้อนี้