JTAG

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

HackTricks

JTAGenum

JTAGenum์€ Arduino ํ˜ธํ™˜ MCU ๋˜๋Š” (์‹คํ—˜์ ์œผ๋กœ) Raspberry Pi์— ๋กœ๋“œํ•˜์—ฌ ์•Œ๋ ค์ง€์ง€ ์•Š์€ JTAG ํ•€ ๋ฐฐ์น˜๋ฅผ ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…ํ•˜๊ณ  ์‹ฌ์ง€์–ด ๋ช…๋ น ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์—ด๊ฑฐํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

  • Arduino: ๋””์ง€ํ„ธ ํ•€ D2โ€“D11์„ ์ตœ๋Œ€ 10๊ฐœ์˜ ์˜์‹ฌ๋˜๋Š” JTAG ํŒจ๋“œ/ํ…Œ์ŠคํŠธ ํฌ์ธํŠธ์— ์—ฐ๊ฒฐํ•˜๊ณ , Arduino GND๋ฅผ ํƒ€๊ฒŸ GND์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ์ผ์ด ์•ˆ์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ชจ๋ฅด๋Š” ํ•œ ํƒ€๊ฒŸ์— ์ „์›์„ ๋ณ„๋„๋กœ ๊ณต๊ธ‰ํ•˜์‹ญ์‹œ์˜ค. 3.3 V ๋กœ์ง์„ ์„ ํ˜ธํ•˜๊ฑฐ๋‚˜ (์˜ˆ: Arduino Due) 1.8โ€“3.3 V ํƒ€๊ฒŸ์„ ํ”„๋กœ๋น™ํ•  ๋•Œ ๋ ˆ๋ฒจ ์‹œํ”„ํ„ฐ/์ง๋ ฌ ์ €ํ•ญ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.
  • Raspberry Pi: Pi ๋นŒ๋“œ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ GPIO๊ฐ€ ์ ์–ด (์Šค์บ” ์†๋„๊ฐ€ ๋А๋ฆผ) ํ˜„์žฌ ํ•€ ๋งต๊ณผ ์ œ์•ฝ ์‚ฌํ•ญ์€ ๋ ˆํฌ๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

ํ”Œ๋ž˜์‹œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด 115200 ๋ณด๋“œ์—์„œ ์‹œ๋ฆฌ์–ผ ๋ชจ๋‹ˆํ„ฐ๋ฅผ ์—ด๊ณ  h๋ฅผ ๋ณด๋‚ด ๋„์›€์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ํ๋ฆ„:

  • l ๋ฃจํ”„๋ฐฑ์„ ์ฐพ์•„ ์ž˜๋ชป๋œ ๊ธ์ • ๊ฒฐ๊ณผ๋ฅผ ํ”ผํ•ฉ๋‹ˆ๋‹ค.
  • r ํ•„์š” ์‹œ ๋‚ด๋ถ€ ํ’€์—…์„ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • s TCK/TMS/TDI/TDO (๋•Œ๋•Œ๋กœ TRST/SRST)๋ฅผ ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค.
  • y ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์€ ์—ฐ์‚ฐ ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์œ„ํ•ด IR์„ ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…ํ•ฉ๋‹ˆ๋‹ค.
  • x ํ•€ ์ƒํƒœ์˜ ๊ฒฝ๊ณ„ ์Šค์บ” ์Šค๋ƒ…์ƒท์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์œ ํšจํ•œ TAP์ด ๋ฐœ๊ฒฌ๋˜๋ฉด FOUND!๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ค„์ด ํ‘œ์‹œ๋˜์–ด ๋ฐœ๊ฒฌ๋œ ํ•€์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

ํŒ

  • ํ•ญ์ƒ ์ ‘์ง€๋ฅผ ๊ณต์œ ํ•˜๊ณ , ์•Œ๋ ค์ง€์ง€ ์•Š์€ ํ•€์„ ํƒ€๊ฒŸ Vtref ์ด์ƒ์œผ๋กœ ๊ตฌ๋™ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์˜์‹ฌ์Šค๋Ÿฌ์šด ๊ฒฝ์šฐ ํ›„๋ณด ํ•€์— 100โ€“470 ฮฉ ์ง๋ ฌ ์ €ํ•ญ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.
  • ์žฅ์น˜๊ฐ€ 4์„  JTAG ๋Œ€์‹  SWD/SWJ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ JTAGenum์ด ์ด๋ฅผ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SWD ๋„๊ตฌ๋‚˜ SWJ-DP๋ฅผ ์ง€์›ํ•˜๋Š” ์–ด๋Œ‘ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์‹ญ์‹œ์˜ค.

Safer pin hunting and hardware setup

  • ๋ฉ€ํ‹ฐ๋ฏธํ„ฐ๋กœ ๋จผ์ € Vtref์™€ GND๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ์–ด๋Œ‘ํ„ฐ๋Š” I/O ์ „์••์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด Vtref๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ ˆ๋ฒจ ์‹œํ”„ํŒ…: ํ‘ธ์‹œ-ํ’€ ์‹ ํ˜ธ๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋œ ์–‘๋ฐฉํ–ฅ ๋ ˆ๋ฒจ ์‹œํ”„ํ„ฐ๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค (JTAG ๋ผ์ธ์€ ์˜คํ”ˆ ๋“œ๋ ˆ์ธ์ด ์•„๋‹™๋‹ˆ๋‹ค). JTAG์— ๋Œ€ํ•ด ์ž๋™ ๋ฐฉํ–ฅ I2C ์‹œํ”„ํ„ฐ๋Š” ํ”ผํ•˜์‹ญ์‹œ์˜ค.
  • ์œ ์šฉํ•œ ์–ด๋Œ‘ํ„ฐ: FT2232H/FT232H ๋ณด๋“œ (์˜ˆ: Tigard), CMSIS-DAP, J-Link, ST-LINK (๋ฒค๋” ํŠน์ •), ESP-USB-JTAG (ESP32-Sx์—์„œ). ์ตœ์†Œํ•œ TCK, TMS, TDI, TDO, GND ๋ฐ Vtref๋ฅผ ์—ฐ๊ฒฐํ•˜์‹ญ์‹œ์˜ค; ์„ ํƒ์ ์œผ๋กœ TRST ๋ฐ SRST๋ฅผ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

First contact with OpenOCD (scan and IDCODE)

OpenOCD๋Š” JTAG/SWD๋ฅผ ์œ„ํ•œ ์‚ฌ์‹ค์ƒ์˜ OSS์ž…๋‹ˆ๋‹ค. ์ง€์›๋˜๋Š” ์–ด๋Œ‘ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฒด์ธ์„ ์Šค์บ”ํ•˜๊ณ  IDCODE๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • J-Link๋ฅผ ์‚ฌ์šฉํ•œ ์ผ๋ฐ˜์ ์ธ ์˜ˆ:
openocd -f interface/jlink.cfg -c "transport select jtag; adapter speed 1000" \
-c "init; scan_chain; shutdown"
  • ESP32โ€‘S3 ๋‚ด์žฅ USBโ€‘JTAG (์™ธ๋ถ€ ํ”„๋กœ๋ธŒ ํ•„์š” ์—†์Œ):
openocd -f board/esp32s3-builtin.cfg -c "init; scan_chain; shutdown"

Notes

  • โ€œ๋ชจ๋“  1/0โ€ IDCODE๋ฅผ ๋ฐ›์œผ๋ฉด, ๋ฐฐ์„ , ์ „์›, Vtref๋ฅผ ํ™•์ธํ•˜๊ณ  ํฌํŠธ๊ฐ€ ํ“จ์ฆˆ/์˜ต์…˜ ๋ฐ”์ดํŠธ์— ์˜ํ•ด ์ž ๊ฒจ ์žˆ์ง€ ์•Š์€์ง€ ํ™•์ธํ•˜์„ธ์š”.
  • ์•Œ ์ˆ˜ ์—†๋Š” ์ฒด์ธ์„ ์˜ฌ๋ฆด ๋•Œ ์ˆ˜๋™ TAP ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•ด OpenOCD ์ €์ˆ˜์ค€ irscan/drscan์„ ์ฐธ์กฐํ•˜์„ธ์š”.

CPU ์ •์ง€ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ/ํ”Œ๋ž˜์‹œ ๋คํ”„

TAP์ด ์ธ์‹๋˜๊ณ  ๋Œ€์ƒ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์„ ํƒ๋˜๋ฉด, ์ฝ”์–ด๋ฅผ ์ •์ง€์‹œํ‚ค๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ๋˜๋Š” ๋‚ด๋ถ€ ํ”Œ๋ž˜์‹œ๋ฅผ ๋คํ”„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ (๋Œ€์ƒ, ๊ธฐ๋ณธ ์ฃผ์†Œ ๋ฐ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜์„ธ์š”):

  • ์ดˆ๊ธฐํ™” ํ›„ ์ผ๋ฐ˜ ๋Œ€์ƒ:
openocd -f interface/jlink.cfg -f target/stm32f1x.cfg \
-c "init; reset halt; mdw 0x08000000 4; dump_image flash.bin 0x08000000 0x00100000; shutdown"
  • RISCโ€‘V SoC (๊ฐ€๋Šฅํ•  ๋•Œ SBA๋ฅผ ์„ ํ˜ธ):
openocd -f interface/ftdi/ft232h.cfg -f target/riscv.cfg \
-c "init; riscv set_prefer_sba on; halt; dump_image sram.bin 0x80000000 0x20000; shutdown"
  • ESP32โ€‘S3, OpenOCD ํ—ฌํผ๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๊ฑฐ๋‚˜ ์ฝ๊ธฐ:
openocd -f board/esp32s3-builtin.cfg \
-c "program_esp app.bin 0x10000 verify exit"

Tips

  • mdw/mdh/mdb๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธด ๋คํ”„ ์ „์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒ€ํ•˜์„ธ์š”.
  • ๋‹ค์ค‘ ์žฅ์น˜ ์ฒด์ธ์˜ ๊ฒฝ์šฐ, ๋น„๋Œ€์ƒ ์žฅ์น˜์—์„œ BYPASS๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“  TAP์„ ์ •์˜ํ•˜๋Š” ๋ณด๋“œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

๊ฒฝ๊ณ„ ์Šค์บ” ํŠธ๋ฆญ (EXTEST/SAMPLE)

CPU ๋””๋ฒ„๊ทธ ์ ‘๊ทผ์ด ์ž ๊ฒจ ์žˆ์–ด๋„ ๊ฒฝ๊ณ„ ์Šค์บ”์ด ์—ฌ์ „ํžˆ ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. UrJTAG/OpenOCD๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ:

  • ์‹œ์Šคํ…œ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ํ•€ ์ƒํƒœ๋ฅผ ์Šค๋ƒ…์ƒทํ•˜๊ธฐ ์œ„ํ•ด SAMPLE์„ ์‚ฌ์šฉํ•˜์„ธ์š” (๋ฒ„์Šค ํ™œ๋™ ์ฐพ๊ธฐ, ํ•€ ๋งคํ•‘ ํ™•์ธ).
  • ํ•€์„ ๊ตฌ๋™ํ•˜๊ธฐ ์œ„ํ•ด EXTEST๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š” (์˜ˆ: ๋ณด๋“œ ๋ฐฐ์„ ์ด ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ MCU๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ SPI ํ”Œ๋ž˜์‹œ ๋ผ์ธ์„ ๋น„ํŠธ ๋ฑ…ํ‚นํ•˜์—ฌ ์˜คํ”„๋ผ์ธ์—์„œ ์ฝ๊ธฐ).

FT2232x ์–ด๋Œ‘ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ ์ตœ์†Œ UrJTAG ํ๋ฆ„:

jtag> cable ft2232 vid=0x0403 pid=0x6010 interface=1
jtag> frequency 100000
jtag> detect
jtag> bsdl path /path/to/bsdl/files
jtag> instruction EXTEST
jtag> shift ir
jtag> dr  <bit pattern for boundary register>

์žฅ์น˜ BSDL์ด ํ•„์š”ํ•˜์—ฌ ๊ฒฝ๊ณ„ ๋ ˆ์ง€์Šคํ„ฐ ๋น„ํŠธ ์ˆœ์„œ๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๊ณต๊ธ‰์—…์ฒด๋Š” ์ƒ์‚ฐ ์ค‘์— ๊ฒฝ๊ณ„ ์Šค์บ” ์…€์„ ์ž ๊ธ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„๋Œ€ ๋Œ€์ƒ ๋ฐ ์ฃผ์˜ ์‚ฌํ•ญ

  • ESP32โ€‘S3/C3๋Š” ๋„ค์ดํ‹ฐ๋ธŒ USBโ€‘JTAG ๋ธŒ๋ฆฌ์ง€๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. OpenOCD๋Š” ์™ธ๋ถ€ ํ”„๋กœ๋ธŒ ์—†์ด USB๋ฅผ ํ†ตํ•ด ์ง์ ‘ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธด๊ธ‰ ์ƒํ™ฉ ๋ฐ ๋คํ”„์— ๋งค์šฐ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • RISCโ€‘V ๋””๋ฒ„๊ทธ(v0.13+)๋Š” OpenOCD์—์„œ ๋„๋ฆฌ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์ฝ”์–ด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ค‘์ง€ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ์œ„ํ•ด SBA๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.
  • ๋งŽ์€ MCU๊ฐ€ ๋””๋ฒ„๊ทธ ์ธ์ฆ ๋ฐ ์ƒ์•  ์ฃผ๊ธฐ ์ƒํƒœ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. JTAG๊ฐ€ ์ฃฝ์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ์ „์›์ด ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ์šฐ, ์žฅ์น˜๊ฐ€ ๋‹ซํžŒ ์ƒํƒœ๋กœ ํ“จ์ฆˆ๊ฐ€ ๊ฑธ๋ ธ๊ฑฐ๋‚˜ ์ธ์ฆ๋œ ํ”„๋กœ๋ธŒ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฉ์–ด ๋ฐ ๊ฐ•ํ™”(์‹ค์ œ ์žฅ์น˜์—์„œ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ)

  • ์ƒ์‚ฐ ์ค‘ JTAG/SWD๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ์ž ๊ธ‰๋‹ˆ๋‹ค(์˜ˆ: STM32 RDP ๋ ˆ๋ฒจ 2, PAD JTAG๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ESP eFuses, NXP/Nordic APPROTECT/DPAP).
  • ์ œ์กฐ ์ ‘๊ทผ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ธ์ฆ๋œ ๋””๋ฒ„๊ทธ(ARMv8.2โ€‘A ADIv6 ๋””๋ฒ„๊ทธ ์ธ์ฆ, OEM ๊ด€๋ฆฌ ์ฑŒ๋ฆฐ์ง€-์‘๋‹ต)๋ฅผ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.
  • ์‰ฌ์šด ํ…Œ์ŠคํŠธ ํŒจ๋“œ๋ฅผ ๋ผ์šฐํŒ…ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค; ํ…Œ์ŠคํŠธ ๋น„์•„๋ฅผ ๋ฌป๊ณ , TAP์„ ๊ฒฉ๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ €ํ•ญ์„ ์ œ๊ฑฐ/๋ฐฐ์น˜ํ•˜๋ฉฐ, ํ‚ค๊ฐ€ ์žˆ๋Š” ์ปค๋„ฅํ„ฐ ๋˜๋Š” ํฌ๊ณ  ํ•€ ๊ณ ์ •์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ „์› ์ผœ๊ธฐ ๋””๋ฒ„๊ทธ ์ž ๊ธˆ: ์ดˆ๊ธฐ ROM ๋’ค์— TAP์„ ๊ฒŒ์ดํŠธํ•˜์—ฌ ๋ณด์•ˆ ๋ถ€ํŒ…์„ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค.

์ฐธ์กฐ

  • OpenOCD ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ โ€“ JTAG ๋ช…๋ น ๋ฐ ๊ตฌ์„ฑ. https://openocd.org/doc-release/html/JTAG-Commands.html
  • Espressif ESP32โ€‘S3 JTAG ๋””๋ฒ„๊น…(USBโ€‘JTAG, OpenOCD ์‚ฌ์šฉ). https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/api-guides/jtag-debugging/

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ