Solution de OliverSwift pour Mommy Morse

hardware radio

6 janvier 2025

Solution de l’épreuve Mommy Morse

L’outil URH a été utilisé pour visualiser le signal de test (signal.iq) En plus des instructions de l’épreuve il fallait juste découvrir que les symboles . ou - sont séparés par une modulation de la porteuse à 1kHz pendant 500µs.

Le format de sortie est simple ce sont des couples de float représentant des imaginaires (voir la définition de numpy.complex64).

Du coup un petit programme en C (une fois n’est pas coutume) permet de générer un fichier flag.iq. On modifie le fichier client.py pour émettre le signal flag.iq et on attrape le flag en réponse.

Source C

#include <stdio.h>
#include <math.h>

float w_cur = 0.0; // Current angle in radian

FILE *out; // Output iq file

#define USEC2SAMPLES(us) ((us)*24/1000)
#define SAMPLE_TIME (1.0/24000.0)

// 5kHz in radian/sec
#define w5 (5000.0 * 2 * M_PI)
// 1kHz in radian/sec
#define w1 (1000.0 * 2 * M_PI)

void sig_gen(float wfreq, int samples) {
    float real;
    float img;

    for(int t = 0; t < samples; t++) {
	real = cos(w_cur);
	img = sin(w_cur);

	fwrite(&real, sizeof(float), 1, out);
	fwrite(&img , sizeof(float), 1, out);

	w_cur += wfreq * SAMPLE_TIME;
    }
}

void gen_dot() {
    sig_gen(w5, USEC2SAMPLES(1000));
}

void gen_dash() {
    sig_gen(w5, USEC2SAMPLES(5000));
}

// Symbols are seperated by a 500us long 1kHz carrier
void gen_sep() {
    sig_gen(w1, USEC2SAMPLES(500));
}

void gen_space() {
    sig_gen(w1, USEC2SAMPLES(5000));
}

int main(int argc, char **argv) {
    //char *message = ".... . .-.. .-.. ---"; // HELLO
    //char *message = argv[1]; // Using argument string
    // Two spaces in a row = word separator
    char *message = "-.-. .- -.  ..  --. . -  - .... .  ..-. .-.. .- --."; // CAN I GET THE FLAG

    out = fopen("flag.iq","w");

    int prec = 0;

    for(char *symbole = message; *symbole; symbole++) {
		switch(*symbole) {
			case '.':
				if (prec) gen_sep();
				gen_dot();
				prec = 1;
				break;
			case '-':
				if (prec) gen_sep();
				gen_dash();
				prec = 1;
				break;
			case ' ':
				gen_space();
				if (prec == 0) { // Double space = word separation
					// Two spaces have already been generated, two extra spaces to be generated left
					gen_space();
					gen_space();
				}
				prec = 0;
				break;
		}
    }

    fclose(out);

    return 0;
}

Compilation

$ cc -o flag flag.c -lm

Exécution

$ ./flag
$ python3 client.py
[+] Opening connection to localhost on port 4000: Done
b'Well done: FCSC{490b88345a22d35554b3e319b1200b985cc7683e975969d07841cd56dd488649}\n'
[*] Closed connection to localhost port 4000

Résultat

FCSC{490b88345a22d35554b3e319b1200b985cc7683e975969d07841cd56dd488649}