En sachant cela, j'ai créé un script qui fait tout ça automatiquement :
import numpy as np
from scipy.io.wavfile import write
from scipy.signal import decimate
# Paramètres
input_file = "fm.iq"
output_file = "output.wav"
input_sample_rate = 48000 # Hz
output_sample_rate = 16000 # Hz (pour lisibilité)
# Lire fichier IQ (on suppose Complex64 ici ; adapter si nécessaire)
iq_data = np.fromfile(input_file, dtype=np.complex64)
print(f"[+] Chargé {len(iq_data)} échantillons IQ")
# Étape 1 : Récupérer la phase
phase = np.angle(iq_data)
# Étape 2 : Différence de phase = fréquence instantanée
# On ajoute un 0 devant pour garder la taille
freq = np.diff(phase, prepend=phase[0])
# Étape 3 : Optionnel - corriger le saut de phase (unwrap)
freq = np.unwrap(freq)
# Étape 4 : Décimation pour baisser la fréquence d'échantillonnage
decim = int(input_sample_rate / output_sample_rate)
audio = decimate(freq, decim)
# Étape 5 : Normaliser entre -1 et 1
audio /= np.max(np.abs(audio))
audio = audio.astype(np.float32)
# Écriture du WAV
write(output_file, output_sample_rate, audio)
print(f"[+] Audio FM sauvegardé dans '{output_file}' ({output_sample_rate} Hz)")
Et en sortie, nous avons un bel audio bien propre que nous pouvons écouter (peut-être un peu rapide) :
🚩FLAG
404CTF{32788739f83}
Tout comme l'autre challenge d'intro (), il fallait réussir à convertir ce fichier .iq (signal audio) en un audio compréhensible par l'oreille humaine.