Mommy morse (Hardware) - FCSC 2022

Mommy morse (Hardware) - FCSC 2022

Fichiers du challenge Principe:
Envoyer un autre message en morse, avec plusieurs fréquences de signaux

Le challenge

On doit envoyer un message au format IQ (fichiers dispos ici)

IQ

D'abord, on cherche un peu ce qu'est ce format IQ, et on voit qu'il peut se lire avec GNURadio

GNU Radio

On lance gnuradio-companion
On insère un file source, qui sera notre IQ
On indique le bon sample rate (donné par le challenge ou par le code serveur)
Et, pour comprendre la logique, je l'ai joué en audio
J'ajoute un File Sink, pour sauvegarder la sortie dans un fichier IQ

On est donc en train de lire un IQ pour l'enregistrer en IQ… Mais c'est voulu: cela me permet de m'assurer qu'une entrée qui marche (l'exemple IQ donné par le serveur) donnera un IQ qui marche. Il me restera plus, ensuite, qu'à remplacer la brique d'entrée "File Source" par une entrée arbitraire en morse

Le client nous est donné, il nous manque peut-etre juste la lib pwn

Une lib utile dans beaucoup de CTF d'ailleurs, j'ai pu la recroiser pour de l'exploitation de binaire, entre autres

Et le fichier IQ qu'on a ainsi généré marche. Cool, on va pouvoir remplacer l'entrée d'exemple par une entrée qu'on va forger

Le signal

A partir de l'entrée d'exemple, et avec un bloc QT, on peut afficher le diagramme des deux canaux IQ
Il ne reste plus qu'à forger l'entrée

Détail

Je n'allais pas juste vous balancer le diagramme! :)
Ici, on va prendre le message d'exemple HELLO. On le convertit en morse, ce qui donne .... . .-.. .-.. ---

On traduit le morse alors en fréquences (5ms5kh signifiant 5ms à 5KHz) selon les règles données par le challenge, et l'on traduit ces fréquences en un vecteur binaire où 0 indiquera une fréquence de 1KHz et 1 indiquera 5KHz

On entre ce vecteur dans une brique "Vector Source". Cette brique sera cablée au 5KHz, en bas, via un Multiply: quand la vecteur vaut 1, la sortie de ce multiply sera un signal de 5KHz
De manière similaire, on cable le vecteur à une source d'1KHz, mais on inverse d'abord le vecteur, pour que 0 devienne 1, et on multiplie le résultat par la source d'1KHz, donnant en sortie un signal de 1KHz quand le vecteur vaut 0
Enfin, on additionne les deux signaux

Pour inverser 0 et 1, j'ai fait -(X - 1): la brique Add Const = -1 transforme 0 en -1 et 1 en 0, et la brique Multiply const = -1 transforme ce -1 en 1

Le signal en sortie a une tete similaire à celle qu'on avait pour le IQ d'exemple (à part l'amplitude que j'ai mal calibrée ici)
On essaie, et ca marche (au détail près qu'il manque une lettre, j'avais coupé mon vecteur trop tôt)

Vecteur d'entrée

On convertit le message demandé CAN I GET THE FLAG en morse -.-. .- -./../--. . -/- .... ./..-. .-.. .- --. puis en vecteur d'entrée

Attention car mes notes ne sont pas correctes à ce niveau là.

Bref, c'est le bordel
Et en effet, c'est foiré... J'ai donc vérifié mes données et vu mon erreur de conversion en morse
Une fois le vecteur corrigé, on le change dans GNURadio, et on relance

Il est probablement possible d'utiliser un fichier comme vecteur d'entrée, mais j'ai été pris par le temps et donc, j'ai fait simple: copier, coller, terminé

On teste en local le nouveau fichier IQ (avec le bon vecteur d'entrée)

Flag

Et on le lance sur le serveur: le flag tombe
FCSC{490b88345a22d35554b3e319b1200b985cc7683e975969d07841cd56dd488649}

Un chouette challenge au final, ne m'étant jamais vraiment servi de GNURadio, c'était sympa de découvrir ce qu'on peut faire avec en termes de traitement de signaux

Fichiers du challenge

↩ Retour à la liste des challenges

⇇ Retour à l'accueil