🇫🇷 FCSC 2022 – I2CyouToo – CTF Write up

Description

Un ami vous affirme qu’une EEPROM de 1024 bits branchée à son Arduino est une solution extrêmement sécurisée pour stocker ses secrets, vu que le protocole utilisé est "obfusqué" et "bas niveau" selon ses dires, "pas comme l’USB qui est hotplug et qu’on peut brancher directement sur n’importe quel OS !".

Voulant le confronter à ses inepties, vous sortez votre analyseur logique pour sniffer la communication entre l’Arduino et l’EEPROM lorsqu’il tape son secret. Pourrez-vous remonter à ce dernier avec vos logiciels Sigrok et gtkwave ?

Ouverture du fichier

On nous donne un fichier vdc. La description nous permet de deviner qu’il faut l’ouvrir avec Sigrok. On obtient le résultat suivant :

Après quelques recherches je comprends c’est une capture d’une communication I2C. Il s’agit d’une communication série synchrone bidirectionnelle half-duplex.

I2C est un protocole de communication série synchrone bidirectionnelle half-duplex qui permet à un microcontrôleur d’interagir avec une grande quantité de périphériques en utilisant uniquement deux lignes de transmission (on l’appelle d’ailleurs parfois "Two Wire Interface").
Série : contrairement à une communication parallèle tous les bits sont transmis les uns à la suite sur un même fil.
Synchrone : La transmission organisé grâce à une horloge qui sert de référence à tous les appareils impliqués dans la communication.
Ce signal d’horloge partagé à tous les appareils via un fil "serial clock" (SCL)
Bi-directionnelle : car l’information peut être transmise dans les 2 sens (du contrôleur vers le périphérique et inversement)
Half-duplex : Lorsque le fil de transmission de données est utilisé (la ligne SDA "serial data"), alors les informations ne peuvent circuler que dans une direction à la fois.

Une fois que l’on comprend cela. Le challenge est en fait presque fini.

Identification de 2 canaux de transmission

Dans le logiciel pulseview, on peut indiquer quel est le protocole à analyser. On obtient alors une analyse des informations échangées.

En augmentant le zoom on distingue des valeurs en hexadécimale :

En lisant la documentation, on comprend qu’avant chaque Ecriture "Data write", l’adresse de l’écriture est envoyée.

Capture the flag

En reconstituant la donnée écrite dans une liste d’adresse contigue on obtient l’hexadecimal suivant :

Copy464353437B4D592D50524543494F55532D504C454153452D535441592D534543524554217D

Ce qui donne le flag suivant :

CopyFCSC{MY-PRECIOUS-PLEASE-STAY-SECRET!}