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:
- //Aktualizacja systemu, instalacja bibliotek
- apt update
- apt upgrade
- apt-get install git autoconf libtool make pkg-config libusb-1.0-0 libusb-1.0-0-dev libftdi-dev telnet
- //Build OpenOCD
- git clone --recursive git://git.code.sf.net/p/openocd/code openocd-git && cd openocd-git
- ./bootstrap
- ./configure --enable-bcm2835gpio --enable-buspirate --enable-maintainer-mode --disable-werror --enable-openjtag_ftdi --prefix=/usr
- make
- make install
Następnie musimy przenieść pliki proxmark.cfg:
- # Ports
- telnet_port 4444
- gdb_port 3333
- # Interface
- source [find interface/raspberrypi123-native.cfg]
- # use combined on interfaces or targets that can’t set TRST/SRST separately
- reset_config srst_only srst_pulls_trst
- jtag newtap sam7x cpu -irlen 4 -ircapture 0x1 -irmask 0xf
- #target create sam7x.cpu arm7tdmi -endian little -chain-position sam7x.cpu -variant arm7tdmi
- target create sam7x.cpu arm7tdmi -endian little -chain-position sam7x.cpu
- sam7x.cpu configure -event reset-init {
- soft_reset_halt
- mww 0xfffffd00 0xa5000004 # RSTC_CR: Reset peripherals
- mww 0xfffffd44 0x00008000 # WDT_MR: disable watchdog
- mww 0xfffffd08 0xa5000001 # RSTC_MR enable user reset
- mww 0xfffffc20 0x00005001 # CKGR_MOR : enable the main oscillator
- sleep 10
- mww 0xfffffc2c 0x000b1c02 # CKGR_PLLR: 16MHz * 12/2 = 96MHz
- sleep 10
- mww 0xfffffc30 0x00000007 # PMC_MCKR : MCK = PLL / 2 = 48 MHz
- sleep 10
- mww 0xffffff60 0x00480100 # MC_FMR: flash mode (FWS=1,FMCN=72)
- sleep 100
- }
- gdb_memory_map enable
- #gdb_breakpoint_override hard
- #armv4_5 core_state arm
- sam7x.cpu configure -work-area-virt 0 -work-area-phys 0x00200000 -work-area-size 0x10000 -work-area-backup 0
- flash bank sam7x.flash.0 at91sam7 0 0 0 0 sam7x.cpu 0 0 0 0 0 0 0 18432
- 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
- #
- # raspberrypi123-native.cfg (now for all of the Raspis)
- # It´s about 4 times faster for writing and 14 times faster for reading
- # compared to the generic sysfsgpio driver
- # Config for using Raspberry Pi's expansion header
- #
- # This is best used with a fast enough buffer but also
- # is suitable for direct connection if the target voltage
- # matches RPi's 3.3V and the cable is short enough.
- #
- # Do not forget the GND connection, pin 6 of the expansion header.
- #
- # Please set the right peripheral_base address and Transition delay
- # depending on which Raspi (1,2 or 3) you use.
- interface bcm2835gpio
- # Raspi2 and Raspi3 peripheral_base address
- bcm2835gpio_peripheral_base 0x3F000000
- # Raspi1 peripheral_base address
- # bcm2835gpio_peripheral_base 0x20000000
- # Transition delay calculation: SPEED_COEFF/khz - SPEED_OFFSET
- # These depend on system clock, calibrated for stock 700MHz
- # bcm2835gpio_speed SPEED_COEFF SPEED_OFFSET
- # Raspi3 BCM2837 (1200Mhz):
- bcm2835gpio_speed_coeffs 194938 48
- # Raspi2 BCM2836 (900Mhz):
- # bcm2835gpio_speed_coeffs 146203 36
- # Raspi1 BCM2835: (700Mhz)
- # bcm2835gpio_speed_coeffs 113714 28
- # Each of the JTAG lines need a gpio number set: tck tms tdi tdo
- # Header pin numbers: 23 22 19 21
- bcm2835gpio_jtag_nums 11 25 10 9
- # or if you have both connected,
- # reset_config trst_and_srst srst_push_pull
- # Each of the SWD lines need a gpio number set: swclk swdio
- # Header pin numbers: 22 18
- bcm2835gpio_swd_nums 25 24
- # If you define trst or srst, use appropriate reset_config
- # Header pin numbers: TRST - 26, SRST - 18
- bcm2835gpio_trst_num 7
- reset_config trst_only
- # bcm2835gpio_srst_num 18 # should be GPIO 24, (maybe typo in original)
- # reset_config srst_only srst_push_pull
- # or if you have both connected,
- # reset_config trst_and_srst srst_push_pull
- # adapter speed in khz
- 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:
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:
- openocd -f /usr/share/openocd/proxmark.cfg
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.