Solution de valdoin pour Baby Morse

intro hardware radio

4 mai 2025

Objectif du challenge

Dans ce challenge, on intéragit avec un serveur qui nous envoie un message en morse, qu’on doit décoder puis encoder notre réponse FLAG qui nous permet d’obtenir le flag de ce challenge.

Résolution du challenge

Pour ce faire, j’ai écrit un script Python qui va interagir directement avec le serveur :

import socket

HOST = 'localhost'
PORT = 4000

# dictionnaire de correspondance lettre -> code morse
MORSE_DICT = {
    'A': '.-',    'B': '-...',  'C': '-.-.',  'D': '-..',
    'E': '.',     'F': '..-.',  'G': '--.',   'H': '....',
    'I': '..',    'J': '.---',  'K': '-.-',   'L': '.-..',
    'M': '--',    'N': '-.',    'O': '---',   'P': '.--.',
    'Q': '--.-',  'R': '.-.',   'S': '...',   'T': '-',
    'U': '..-',   'V': '...-',  'W': '.--',   'X': '-..-',
    'Y': '-.--',  'Z': '--..',
    '0': '-----', '1': '.----', '2': '..---', '3': '...--',
    '4': '....-', '5': '.....', '6': '-....', '7': '--...',
    '8': '---..', '9': '----.'
}

# inversion du dictionnaire qui nous servira pour la fonction d'encodage
morse_to_letter = {value: key for key, value in MORSE_DICT.items()}

def text_2_morse(text):
    return ' '.join(MORSE_DICT.get(c.upper(), '?') for c in text)

def morse_2_text(morse):
    letters = morse.strip().split()
    return ''.join(morse_to_letter.get(code, '?') for code in letters)

with socket.create_connection((HOST, PORT)) as sock:
    while True : 
        data = sock.recv(1024) # lecture des données envoyées par le serveur
        message = data.decode().strip()
        if 'fcsc' in message.lower():
            print("Solution :", message) 
            break # on ferme la connexion quand le serveur nous a envoyé le flag
        print("Message reçu :", message)
        print("Traduction :", morse_2_text(message))
        reply = input("Veuillez entrer votre réponse:")
        encoded_reply = text_2_morse(reply)
        print("Réponse encodée :", encoded_reply )
        sock.sendall((encoded_reply + '\n').encode()) # envoi de la réponse suivie d'un retour à la ligne pour valider l'entrée côté serveur

Résultat

Message reçu : --.- ..- . ...- --- ..- .-.. . --.. ...- --- ..- ... 
>>>
Traduction : QUEVOULEZVOUS?
Veuillez entrer votre réponse:FLAG
Réponse encodée : ..-. .-.. .- --.
Solution : Bien joué, le flag est :
FCSC{de8b4af784cd394ecc305979ffa124a112a18046037b42c94e4e85216180847e}

La solution est donc FCSC{de8b4af784cd394ecc305979ffa124a112a18046037b42c94e4e85216180847e}.