Solution de prae_gitlab pour Petite frappe 2/3

forensics linux logs

6 décembre 2024

Analyse des keycodes d’un clavier sous Unix/Linux

À la première étude, on pense à des keycodes type JavaScript, mais finalement non. En regardant du côté de Xorg, on peut trouver deux fichiers intéressants :

  • /usr/share/X11/xkb/symbols/fr
  • /usr/share/X11/xkb/keycodes/evdev

Si on prend la première ligne “key press 46”, recherchons l’occurrence 46 dans le fichier evdev :

$ grep "= 46;" evdev
    <AC09> = 46;

Et si on essaye de trouver son occurrence dans “symbols/fr” :

$ grep "<AC09>" fr | head -n1
    key <AC09>    { [                l,                L,            0x1000140,             0x100013F ] }; // l L ŀ Ŀ

La première ligne est un “L” Essayons chaque ligne avec une méthode un peu plus automatique.

Analyse à l’arrache

On va coder un petit script qui va se charger d’aller chercher les différents keycodes :

grep "key press" petite_frappe_2.txt | while read line;
do
        keycode=$(echo "${line}" | awk '{ print $3 }');
        keycode=$(grep "= ${keycode};" /usr/share/X11/xkb/keycodes/evdev | awk '{ print $1 }')
        grep "${keycode}" /usr/share/X11/xkb/symbols/fr | head -n1 | awk -F'[' '{ print $2 }' | awk '{ print $1 }'
done

Et en l’exécutant :

$ ./get-keycode.sh | xargs
l, a, space, s, o, l, u, t, i, o, n, space, a, v, e, c,
space, x, i, n, p, u, t, space, n, e, space, s, e, m, b, l, e,
space, p, a, s, space, s, u, p, e, r, space, p, r, a, t, i, q, u, e,
space, a, space, d, e, c, o, d, e, r, semicolon, space, l, e,
space, f, l, a, g, space, e, s, t, space, u, n, underscore,
c, l, a, v, i, e, r, underscore, a, z, e, r, t, y, underscore,
e, n, underscore, v, a, u, t, underscore, d, e, u, x,

On découvre une phrase :

la solution avec xinput ne semble pas super pratique a decoder: le flag est un_clavier_azerty_en_vaut_deux

Le flag est donc … ? :)

FCSC{un_clavier_azerty_en_vaut_deux}

Version avec xmodmap

On peut sinon le faire de manière bourrine en filtrant avec l’output xmodmap :

grep "key press" petite_frappe_2.txt | while read line;
do
        keycode=$(echo "${line}" | awk '{ print $3 }');
        xmodmap -pke | grep " ${keycode} = " | awk '{ print $4 }
done;
$ ./scan.sh | xargs
l a space s o l u t i o n space a v e c space x i n p u t space n e
space s e m b l e space p a s space s u p e r space p r a t i q u e
space a space d e c o d e r Shift_R semicolon space l e space f l a g
space e s t space u n underscore c l a v i e r underscore a z e r t y
underscore e n underscore v a u t underscore d e u x