Voici un script Julia qui réalise les opérations suivantes :
-
Lecture des données :
data = read(filename)
: Le fichier est lu sous forme de bytes brutssamples = reinterpret(Float32, data)
: Les bytes sont réinterprétés comme des nombres flottants 32 bits (Float32)
-
Vérification de l’intégrité :
@assert length(samples) % 2 == 0
: On vérifie que le nombre d’échantillons est pair car chaque point du signal comprend une paire I/Qn_samples = div(length(samples), 2)
: Calcule le nombre de paires I/Q dans le signal
-
Séparation I/Q :
i_samples = samples[1:2:end]
: Extrait les composantes I (indices impairs: 1,3,5,…)q_samples = samples[2:2:end]
: Extrait les composantes Q (indices pairs: 2,4,6,…)
-
Préparation pour le hachage :
i_bytes = reinterpret(UInt8, i_samples)
: Reconvertit les composantes I en bytesq_bytes = reinterpret(UInt8, q_samples)
: Reconvertit les composantes Q en bytesfinal_data = [i_bytes; q_bytes]
: Concatène tous les I suivis de tous les Q
-
Calcul du flag :
hash = bytes2hex(sha256(final_data))
: Calcule le hash SHA256 des données concaténéesreturn "FCSC{$hash}"
: Retourne le flag au format demandé
Le point clé de ce code est la manipulation des données sous deux formes :
- Sous forme de bytes (pour la lecture et le hash)
- Sous forme de Float32 (pour séparer facilement les composantes I et Q)
La fonction reinterpret
est cruciale, car elle permet de passer d’une représentation à l’autre sans modifier les données brutes.
C’est important car le hash doit être calculé sur les bytes exacts, dans l’ordre spécifié.
Fichier main.jl
:
using SHA
function process_iq_file(filename)
# Lire le fichier en bytes
data = read(filename)
# Convertir les bytes en float32
samples = reinterpret(Float32, data)
# Vérifier que nous avons un nombre pair d'échantillons (I/Q)
@assert length(samples) % 2 == 0
n_samples = div(length(samples), 2)
# Séparer les composantes I et Q
# Les indices impairs sont I, les pairs sont Q
i_samples = samples[1:2:end] # prend 1,3,5,...
q_samples = samples[2:2:end] # prend 2,4,6,...
# Reconvertir en bytes pour le hash
i_bytes = reinterpret(UInt8, i_samples)
q_bytes = reinterpret(UInt8, q_samples)
# Concaténer I et Q
final_data = [i_bytes; q_bytes]
# Calculer le hash SHA256
hash = bytes2hex(sha256(final_data))
return "FCSC{$hash}"
end
# Usage
flag = process_iq_file("file-format.iq")
println(flag)
On exécute le script via : julia main.jl
et on obtient le flag :
FCSC{843161934a8e53da8723047bed55e604e725160b868abb74612e243af94345d7}