Reproduction d'un signal en Morse avec Python

Write-up du challenge DaddyMorse du CTF FCSC (édition 2022)

Le

Le FCSC édition 2022 a proposé dans ce troisième challenge de la catégorie Hardware de s’intéresser au traitement du signal en nous demandant de générer du morse dans un fichier au format IQ.

Énoncé FCSC 2022 Daddy Morse : envoyer un message en morse au serveur avec les paramètres de transmission imposés

Introduction

En cherchant un peu sur le net, je suis tombé sur ça: https://github.com/jgibbard/iqtool. 

GitHub : README du projet iqtool, outils Python pour générer et visualiser des fichiers IQ

Je vais m’en servir comme base (c’est à dire que je vais aller récupérer du code dedans… 😉).

Code Python : fonction transformMorse qui convertit le texte en points et tirets via un dictionnaire morse

Premièrement, j’ajoute une fonction pour transformer du texte en morse sous forme écrite, c’est-à-dire à base de . et de -.

J’importe mon signal sur Audacity, avec les paramètres ci-dessous :
Audacity : import de données brutes en PCM 16 bits signé, gros-boutiste, mono

Et j’obtiens :

Audacity : forme d'onde carrée du signal d'exemple, impulsions courtes et longues du morse

La suite n’est pas très conventionnelle. En effet, n’ayant pas vu le fichier server.py fourni par le CTF, j’ai donc dû faire autrement. J’ai pris par ci par là les bouts de code qui m’intéressaient dans le script iqgen.py du repository GitHub, et j’ai ensuite généré des signaux que j’ai importés dans Audacity afin de reproduire le signal source. Ne vous inquiétez-pas, je développe cela ci-dessous.

Reproduire le signal source

  • Etape 1 : trouver l’amplitude

La première étape consiste à trouver l’amplitude du signal attendu. Pour cela, j’ouvre le fichier signal.iq fournit, et je regarde la valeur hexadécimale

Éditeur hexadécimal : le fichier signal.iq répète la valeur 80 3F, encadrée en rouge

Je regarde combien cela vaut en décimal mais attention, il s’agit d’un nombre signé, et négatif d’ailleurs d’après ce que montre Audacity.

Convertisseur en ligne : 803f vaut -32705 en complément à deux signé

Donc l’amplitude du signal carré alterne entre -32705 et 0. Il faut maintenant générer un signal carré. 

  • Etape 2 : générer un signal carré

D’abord, je commence par compter le nombre de points composant un signal court, celui composant un signal long, le nombre de points entre chaque signal et le nombre de points entre chaque groupe de signaux.

Audacity : zoom sur le signal pour compter les échantillons composant une impulsion

On obtient le résultat suivant :

  • durée_signal_court = 48 pts
  • durée_signal_long = 240 pts
  • durée_entre_signal = 48 pts
  • durée_entre_groupes_signaux = 240 pts

C’est à peu près à ce moment que je suis tombé sur le fichier server.py, qui a confirmé le nombre de points que j’ai comptés 😊 (On a la même relation de proportionnalité entre les différentes variables).
Code de server.py : constantes de durée du point, du tiret, de l'espace entre lettres et entre mots

Et par ce biais j’obtiens le nombre de points codant l’espace, 20*48.

On peut donc commencer la création de notre tableau de valeur avec NumPy

  • Etape 3 : NumPy

Code Python : appel de generateSquare avec l'amplitude de 32705 trouvée précédemment

Code Python : fonction generateSquare qui construit le signal carré morse avec NumPy

Générer le fichier IQ

Il ne reste plus qu’à générer le fichier IQ. Pour cela j’ai «repris» des petits bouts de code du repository GitHub cité auparavant.

Code Python : conversion du signal en entiers 16 bits et écriture du fichier output.iq

Il ne reste plus qu’à générer le signal avec le texte demandé, et l’envoyer via le client.py fourni par l’énoncé pour obtenir le flag. 

😊

Accès Restreint

Cet article n'est pas (encore) publique.
Pour obtenir un accès anticipé, contactez-moi.

[[ passwordError ]]

[[ post.title ]]

[[ post.description ]]

Le [[ post.date ]]

[[ tag ]]
[[ currentMatchIndex + 1 ]] / [[ searchMatches.length ]] 0 / 0

Sommaire

Page principale