Pour résoudre ce challenge, on dispose de 3 éléments :
- deux images, qui correspondent aux 2 faces d’un circuit imprimé
- un accès à un port série.
On commence par se connecter au port série. On obtient ce résultat :
MicroPython v1.22.2 on 1980-01-01; Mysterious FCSC board with STM32F405RG
Type "help()" for more information.
>>>
On constate donc que l’on est sur un microcontrôleur STM32F405RG qui tourne sous Micropython. Ça tombe bien : j’ai une petite expérience avec les Rasberry PI Pico.
On a aussi les deux images du PCB. On a deux puces montées en surface, quelque condensateurs, un quartz, un bouton, un port série, et 10 fiches mâles… rien de bien foufou !!
On a identifié le micro-contrôleur. Pour la deuxième puce, on a une référence IS25LP080D. Après recherche, c’est une mémoire flash qui communique en série.
Première étape, on récupère les Datasheets pour avoir le pin out de la mémoire :
Voici un tableau qui explique les acronymes :
PIN | Fonction |
---|---|
Vcc | alimentation + |
GND | alimentation - |
WP# | protection en écriture |
SCK | signal d’horloge |
CE# | chip enable |
HOLD# | on s’en fiche, c’est pas connecté |
SO | signal output |
SI | signal input |
On peut identifier le sens des composants avec la flèche blanche qui pointe la broche 1.
On va maintenant chercher à identifier quelles broches du micro contrôleur sont connectées à quelles broches de la mémoire flash.
Dans la mesure où les pins du micro-contrôleur sont numérotés dans le sens inverse des aiguilles d’une montre, on a les correspondances suivantes :
PIN mémoire | PIN microcontroleur |
---|---|
SCK | 34 |
SI/SO | 35/36 |
CE | 33 |
On va maintenant regarder le PIN out du micro-contrôleur dans la documentation.
On se rend compte que PB12
, PB13
, PB14
et PB15
correspondent à SPI2_NSS
, SPI2_CSK
, SPI2_MISO
, SPI2_MOSI
.
On constate que la mémoire est branchée sur l’interface SPI-2. (Serial Peripheral Interface)
On passe maintenant à l’exploitation. On va écrire un code Python pour lire la mémoire :
from machine import Pin, SPI
spi2 = SPI(2, baudrate=10000000)
cs = Pin("PB12", Pin.OUT)
cs.value(0)
spi2.write(b'\x03') # commande d'ecriture
spi2.write(bytearray([(0 >> 16) & 0xFF, (0 >> 8) & 0xFF, 0 & 0xFF]))
data = bytearray(1024)
spi2.readinto(data)
print(data)
et l’on obtient le flag qui est donc :
FCSC{a8937c95944625276140d65539299e81e179ec2293417010817a7a595fca987f}