neděle 25. března 2018

Reverzní inženýrství

Začalo to pokusem zprovoznit JTAG pod OpenOCD. S ASIX Presto jsem si s touto kombinací vylámal zuby už dávno ale s RaspberryPi 3 by to mohlo jít.

Nejprve je nutné OpenOCD pro RaspberryPi stáhnout a přeložit (tak například takto):

git clone git://git.code.sf.net/p/openocd/code openocd-code

Dále je potřeba v konfiguraci povolit veškeré požadované rozhraní (hlavně --enable-sysfsgpio --enable-bcm2835gpio ale FTDIčko také není na závadu)

./bootstrap
./configure

A potom už jen make a nainstalovat,

make
sudo make install

všechny potřebné skripty pro jeho používání nalezneme v /usr/local/share/openocd/scripts/

Nyní již stačí správně propojit drátky, kdo má drátků málo, tak použije SWD (SWDIO, SWDCLK, GND) kdo má drátků hodně nebo tak akorát může použít JTAG (TCK, TMS, TDI, TDO, TRST, SRST).

Pro RaspberryPi 3 jsem použil soubor s konfigurací raspberrypi2-native.cfg, zde je možné zvolit zda JTAG nebo SWD.

Po drobném laborování jsem si udělal upravil soubor raspberrypi2.cfg, tak aby bylo možné použít jedno nebo druhé se stejným zapojením:

#
# 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.
#

interface bcm2835gpio

#RPi2 & RPi3
bcm2835gpio_peripheral_base 0x3F000000
#RPi1
#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
#RPi2 & RPi3
bcm2835gpio_speed_coeffs 146203 36
#RPi1
#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: 23 22
bcm2835gpio_swd_nums 11 25

# 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
#reset_config srst_only srst_push_pull

# or if you have both connected,
reset_config trst_and_srst srst_push_pull

OpenOCD spustíme příkazem (pozor na pořadí parametrů):

sudo openocd -f interface/raspberrypi2-native.cfg -c "transport select swd" -f target/stm32f3x.cfg
nebo
sudo openocd -f interface/raspberrypi2-native.cfg -c "transport select jtag" -f target/stm32f3x.cfg

A už nám OpenOCD pěkně čeká na spojení (pozor na Discavery Boardech je třeba odpojit piny STLinku a někdy i tahá za další, takže odpojení a připojení napájení destičky vždy pomohlo).


Po připojení většinou procesor běží, je nutné ho zastavit příkazem:
reset halt

a nyní již můžeme vyčíst registry:


Dále si můžeme nechat zobrazit paměť (šuf obsah FLASH).


Dále se zeptáme na paměťové banky - ověříme si, že FLASH je zde namapována od adresy 0x08000000


A stáhneme si obsah flash paměti





a když už máme FW, tak co se takhle do něho podívat? Využil jsem to jako první seznámení s radare2:

ToDo:

pohrát si s binwalk, nejlépe si vyčíst FW z OpenWRT routeru.
https://www.youtube.com/watch?v=GIU4yJn2-2A
https://www.youtube.com/watch?v=8dXhrOEGHTY
https://www.youtube.com/watch?v=oXSx0Qo2Upk

Jinak OpenOCD bylo nutné přeložit, pro Presto je potřeba ještě přeložit také knihovnu libftdi a potom už svatá trojka.

nebo libftdi je možné nainstalovat sudo apt-get install libusb-1.0 libusb-dev a změnit --prefix na "--prefix=/usr/"

./configure \
--enable-ftdi \
--enable-stlink \
--enable-ti-icdi \
--enable-ulink \
--enable-dummy \
--enable-usb-blaster-2 \
--enable-jlink \
--enable-osbdm \
--enable-opendous \
--enable-aice \
--enable-vsllink \
--enable-usbprog \
--enable-rlink \
--enable-armjtagew \
--enable-parport \
--enable-jtag_vpi \
--enable-usb_blaster_libftdi \
--enable-amtjtagaccel \
--enable-gw16012 \
--enable-ep93xx \
--enable-presto_libftdi \
--enable-openjtag_ftdi \
--enable-buspirate \
--enable-sysfsgpio \
--enable-arm-jtag-ew \
--enable-bcm2835gpio \
--enable-at91rm9200 \
--enable-ft2232_libftdi \
--enable-parport-ppdev \
--enable-parport-giveio \
--enable-remote-bitbang \
--prefix=/home/pi/libftdi1-1.4/libftdi1-1.4/
make
make install

https://pinout.xyz/