piątek, 17 listopada 2023

Proxmark 3 Easy - Odblokowanie, wgrywanie pełnego obrazu

W tym poście opiszę sposób czyszczenia i wgrywania nowego oprogramowania do czytnika Proxmark 3 Easy z wykorzystaniem Raspberry pi 3. 


We wcześniejszym poście dotyczącym odczytu kart Desfire wspomniałem o problemach z wgraniem pełnej wersji oprogramowania.


Ten problem należało rozwiązać przez podłączenie JTAGA do procesora i usunięcie oprogramowania wraz z ewentualnymi ustawionymi lockbitami na procesorze AT91SAM7S512.

Nie posiadam dedykowanego JTAGA, z tego powodu zdecydowałem się na użycie Raspberry Pi wraz z oprogramowaniem OpenOCD. Open On-Chip Debugger, to oprogramowanie typu open-source, które umożliwia debugowanie i programowanie mikrokontrolerów. Pozwala na debugowanie oraz wgrywanie oprogramowania na układy. 

Procedura instalacyjna została opisana na GitHubie, pod tym linkiem. Cały proces instalacyjny, na nowym systemie Raspberry przebiegł bezproblemowo. 

Skrócony wykaz komend jest następujący:

  1. //Aktualizacja systemu, instalacja bibliotek
  2. apt update
  3. apt upgrade
  4. apt-get install git autoconf libtool make pkg-config libusb-1.0-0 libusb-1.0-0-dev libftdi-dev telnet
  5. //Build OpenOCD
  6. git clone --recursive git://git.code.sf.net/p/openocd/code openocd-git && cd openocd-git
  7. ./bootstrap
  8. ./configure --enable-bcm2835gpio --enable-buspirate --enable-maintainer-mode --disable-werror --enable-openjtag_ftdi --prefix=/usr
  9. make
  10. make install

Następnie musimy przenieść pliki proxmark.cfg:

  1. # Ports
  2. telnet_port 4444
  3. gdb_port 3333
  4.  
  5. # Interface
  6. source [find interface/raspberrypi123-native.cfg]
  7.  
  8. # use combined on interfaces or targets that can’t set TRST/SRST separately
  9. reset_config srst_only srst_pulls_trst
  10. jtag newtap sam7x cpu -irlen 4 -ircapture 0x1 -irmask 0xf
  11.  
  12. #target create sam7x.cpu arm7tdmi -endian little -chain-position sam7x.cpu -variant arm7tdmi
  13. target create sam7x.cpu arm7tdmi -endian little -chain-position sam7x.cpu
  14.  
  15. sam7x.cpu configure -event reset-init {
  16.     soft_reset_halt
  17.     mww 0xfffffd00 0xa5000004   # RSTC_CR: Reset peripherals
  18.     mww 0xfffffd44 0x00008000   # WDT_MR: disable watchdog
  19.     mww 0xfffffd08 0xa5000001   # RSTC_MR enable user reset
  20.     mww 0xfffffc20 0x00005001   # CKGR_MOR : enable the main oscillator
  21.     sleep 10
  22.     mww 0xfffffc2c 0x000b1c02   # CKGR_PLLR: 16MHz * 12/2 = 96MHz
  23.     sleep 10
  24.     mww 0xfffffc30 0x00000007   # PMC_MCKR : MCK = PLL / 2 = 48 MHz
  25.     sleep 10
  26.     mww 0xffffff60 0x00480100   # MC_FMR: flash mode (FWS=1,FMCN=72)
  27.     sleep 100
  28. }
  29. gdb_memory_map enable
  30. #gdb_breakpoint_override hard
  31.  
  32. #armv4_5 core_state arm
  33. sam7x.cpu configure -work-area-virt 0 -work-area-phys 0x00200000 -work-area-size 0x10000 -work-area-backup 0
  34. flash bank sam7x.flash.0 at91sam7 0 0 0 0 sam7x.cpu 0 0 0 0 0 0 0 18432
  35. flash bank sam7x.flash.1 at91sam7 0 0 0 0 sam7x.cpu 1 0 0 0 0 0 0 18432

Konfiguruje on dane dotyczące mikrokontrolera zastosowanego na płytce Proxmark, czyli AT91SAM7S512.

oraz raspberrypi123-native.cfg

  1. #
  2. # raspberrypi123-native.cfg (now for all of the Raspis)
  3. # It´s about 4 times faster for writing and 14 times faster for reading
  4. # compared to the generic sysfsgpio driver
  5.  
  6. # Config for using Raspberry Pi's expansion header
  7. #
  8. # This is best used with a fast enough buffer but also
  9. # is suitable for direct connection if the target voltage
  10. # matches RPi's 3.3V and the cable is short enough.
  11. #
  12. # Do not forget the GND connection, pin 6 of the expansion header.
  13. #
  14. # Please set the right peripheral_base address and Transition delay
  15. # depending on which Raspi (1,2 or 3) you use.
  16.  
  17. interface bcm2835gpio
  18. # Raspi2 and Raspi3 peripheral_base address
  19. bcm2835gpio_peripheral_base 0x3F000000
  20.  
  21. # Raspi1 peripheral_base address
  22. # bcm2835gpio_peripheral_base 0x20000000
  23.  
  24. # Transition delay calculation: SPEED_COEFF/khz - SPEED_OFFSET
  25. # These depend on system clock, calibrated for stock 700MHz
  26. # bcm2835gpio_speed SPEED_COEFF SPEED_OFFSET
  27.  
  28. # Raspi3 BCM2837 (1200Mhz):
  29. bcm2835gpio_speed_coeffs 194938 48
  30.  
  31. # Raspi2 BCM2836 (900Mhz):
  32. # bcm2835gpio_speed_coeffs 146203 36
  33.  
  34. # Raspi1 BCM2835: (700Mhz)
  35. # bcm2835gpio_speed_coeffs 113714 28
  36.  
  37. # Each of the JTAG lines need a gpio number set: tck tms tdi tdo
  38. # Header pin numbers: 23 22 19 21
  39. bcm2835gpio_jtag_nums 11 25 10 9
  40.  
  41. # or if you have both connected,
  42. # reset_config trst_and_srst srst_push_pull
  43.  
  44. # Each of the SWD lines need a gpio number set: swclk swdio
  45. # Header pin numbers: 22 18
  46. bcm2835gpio_swd_nums 25 24
  47.  
  48. # If you define trst or srst, use appropriate reset_config
  49. # Header pin numbers: TRST - 26, SRST - 18
  50.  
  51. bcm2835gpio_trst_num 7
  52. reset_config trst_only
  53.  
  54. # bcm2835gpio_srst_num 18 # should be GPIO 24, (maybe typo in original)
  55. # reset_config srst_only srst_push_pull
  56.  
  57. # or if you have both connected,
  58. # reset_config trst_and_srst srst_push_pull
  59.  
  60. # adapter speed in khz
  61. adapter_khz 200

Ustawia on piny dla JTAGA, prędkości transmisji itp itd. 

Po poprawnej instalacji należy pamiętać o pobraniu odpowiedniego oprogramowania. Skompilowane projekty można pobrać ze strony ProxmarkBuilds. Na płytkę Raspberry należy przegrać wszystkie pliki binarne dostępne w katalogu recovery. W tym celu można wykorzystać pendrive lub połączenie SSL wraz z poleceniem scp.

Podłączenie pomiędzy Raspberry Pi a układem Proxmark3 jest następujące:


Zasilanie dostarczałem z osobnego źródła zasilania przez port USB.

Po podłączeniu należy zewrzeć ze sobą piny 54 oraz 55, po czym podłączyć zasilanie płytki Proxmark3. 

Uruchamiamy dwa terminale, np. z użyciem programu Putty. Na jednym należy uruchomić program OpenOCD poleceniem:

  1. openocd -f /usr/share/openocd/proxmark.cfg


Na drugim terminalu łączymy się z OpenOCD przez Telnet:


Następnie, co jest już zawarte w powyższym screenie, wykonuję operację zatrzymania, usunięcia lockbitów (w tym przypadku wydawało się to zmienne, prawdopodobnie zostały usunięte przy czyszczeniu procesora) oraz wgrania nowego oprogramowania z pliku proxmark3_recovery.bin. Można także wgrać osobne dwa pliki bootloader oraz flash.

Po zakończeniu operacji, podłączyłem układ przez USB i spróbowałem wgrać oprogramowanie. Tym razem całość przeszła bezproblemowo. 


Po podłączeniu odczytujemy wersję oprogramowania: