Table des matières
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}