--- tags: DGSE, 2020, CTF, Hardware --- # Write-up - DGSE/ESIEE - 2020 - KeyPad Sniffer ## Catégorie: Hardware ###### Enoncé > Le code d'accès d'un centre militaire de télécommunications est saisi sur un clavier. Un agent a accédé au matériel (Cf. photos face avant et face arrière du clavier) et a inséré un dispositif pour enregister les données binaires qui transitent sur le connecteur du clavier. Le fichier joint (keypad_sniffer.txt) comprend les données binaires (échantillonnées à une fréquence de 15 kHz) au moment où une personne autorisée rentrait le code d'accès. Retrouvez le code d'accès. Le flag est de la forme DGSESIEE{X} où X est le code saisi ### Analyser les photos Face | Dos :---------------------:|:----------------------: ![](https://i.imgur.com/oiFPhiV.jpg =300x)| ![](https://i.imgur.com/aKpSO7x.jpg =300x) On remarque que le keypad est composé de 16 touches et qu'elles sont connectées à huits pins. En général, un keypad à 16 touches est connecté de la manière suivante: ![](https://2.bp.blogspot.com/-xnU1ECyj-dI/V54N48O-ZUI/AAAAAAAAIhY/m9Nv6bXqg44nr-pOjWNbgzYbP4ZjC-3YwCLcB/s1600/KEYPAD-16KEY-03.jpg =400x) Par exemple, si on appuie sur la touche '6', le code binaire correspondant serait '0010 0100' car elle se situe sur la 2ème ligne et 3ème colonne. (Broche1 => bit1 (LSB), broche2 => bit2 ...) Analysons ensuite le connecteur rajouté par l'agent. Comme on peut le voir sur la photo de dos, le connecteur est composé de 12 broches, dont 4 qui ne sont pas utilisés (5, 6, 11 et 12). On remarque ensuite, en suivant les connections des pin du keypad à ceux du connecteur, que les broches 1 à 4 et 5 à 8 du keypad correspondent respectivement aux broches 4 à 1 et 10 à 7 du connecteur. On peut donc associer chaque broche du connecteur aux colonnes et lignes du keypad: >broche 1 ---> colonne 4 broche 2 ---> colonne 3 broche 3 ---> colonne 2 broche 4 ---> colonne 1 broche 7 ---> ligne 4 broche 8 ---> ligne 3 broche 9 ---> ligne 2 broche 10 ---> ligne 1 ### Analyser le fichier d'enregistrement Regardons maintenant le fichier d'enregistrement: > **10**1111**10**0111 **10**1111**10**0111 **10**1111**10**0111 ... **10**1111**10**1110 **10**1111**10**1110 ... **10**1011**10**1101 ... Comme prévu, on remarque que les bits 5, 6, 11 et 12 (en **gras**) ne sont pas utilsés, ils correspondent toujours à la même valeur. Optionnellement et pour plus de clareté, on peut faire un petit script permettant de supprimer ces bits pour donner quelque chose comme ça: > 1111 0111 1111 0111 1111 0111 ... 1111 1110 1111 1110 ... 1011 1101 ... On se retrouve donc avec nos 2 groupes de 4 bits. On comprend assez rapidement le pattern, et que lorsque le groupe de 4 bits (de gauche) est "1111", cela signifie qu'aucune touche n'est enfoncée. Lorsqu'il y a un '0' dedans, cela signifie qu'un touche est enfoncée. Et comme on l'a vu plus haut, on sait quelle touche est pressée en fonction de quels bits sont à 0. :::info **Exemple:** `1011 1101` on a les bits 2 et 9 d'activés (bits 5 et 6 supprimés <span style="font-size:0.8em">(~~10~~**1011**~~10~~**1101**)</span>): broche 2 ---> colonne 3 broche 9 ---> ligne 2 Ce qui correspond à la touche '6' ::: Mais comment savoir si une touche a été pressée une ou plusieurs fois ? On nous dit que le fréquence d'échantillonage est **15kHz**, soit un échantillon toute les **1/15000 secondes**. On va supposer que les touches sont pressées à un interval d'au moins 1 seconde pour commencer. En parcourant toutes les lignes de l'enregistrement dans un script, on repère si une touche est pressée lorsque les 4 derniers bits ne sont pas tous égaux à '1'. On fait la correspondance entre les bits 0 (pour la ligne et la colonne du keypad) et la touche du keypad appuyée, puis nous sautons le nombre de lignes correspondant à: $$ nbLignes = {interval(secondes)\over {1 \over frequence(Hz)}} = {1 \over {1 \over 15000}} = {15000} $$ De cette manière, on peut jouer avec un interval variable. Plus on augmente l'interval de temps entre lequel on appuie sur une touche, plus on réduit le nombre de faux positifs, mais plus on risque de ne pas détecter une touche pressée. Avec un interval de 1 seconde, on a de la chance, on trouve directement le flag ! **Flag: DGSESIEE{AE78F55C666B23011924}**