Solution de s-celles pour File Format

intro hardware radio

10 janvier 2025

Voici un script Julia qui réalise les opérations suivantes :

  1. Lecture des données :

    • data = read(filename) : Le fichier est lu sous forme de bytes bruts
    • samples = reinterpret(Float32, data) : Les bytes sont réinterprétés comme des nombres flottants 32 bits (Float32)
  2. 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/Q
    • n_samples = div(length(samples), 2) : Calcule le nombre de paires I/Q dans le signal
  3. 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,…)
  4. Préparation pour le hachage :

    • i_bytes = reinterpret(UInt8, i_samples) : Reconvertit les composantes I en bytes
    • q_bytes = reinterpret(UInt8, q_samples) : Reconvertit les composantes Q en bytes
    • final_data = [i_bytes; q_bytes] : Concatène tous les I suivis de tous les Q
  5. Calcul du flag :

    • hash = bytes2hex(sha256(final_data)) : Calcule le hash SHA256 des données concaténées
    • return "FCSC{$hash}" : Retourne le flag au format demandé

Le point clé de ce code est la manipulation des données sous deux formes :

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}