Skip to main content Link Search Menu Expand Document (external link)

20 years of uptime

Challenge reverse pendant la finale ECW 2022.

On nous fournit un fichier os.bin et on doit le lancer avec qemu -fda os.bin

C’est un crackme x86 sans OS (directement dans un MBR). C’est un peu compliqué à ouvrir dans Ghidra, mais on peut s’aider de QEMU pour trouver directement la bonne fonction à reverser:

Pour ça on lance en mode gdbserver:

$ qemu-system-i386 -s -fda os.bin

Et on s’accroche avec gdb:

(gdb) set architecture i386
The target architecture is set to "i386".
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
0x0000b5e9 in ?? ()
(gdb) x/8x $sp
0x7ff4: 0x00007c50      0x00007cf4      0x7c2f0246      0x00000000
0x8004: 0x00000000      0x00000000      0x00000000      0x00000000

Avec la pile on peut identifier la fonction intéressante avec l’adresse de retour 0x7cf4:

       0000:7ce8 bb ab 7c        MOV        BX,0x7cab
       0000:7ceb 0f b6 0e a9 7c  MOVZX      CX,byte ptr [0x7ca9]
                             LAB_0000_7cf0
       0000:7cf0 b4 00           MOV        AH,0x0
       0000:7cf2 cd 16           INT        0x16
       0000:7cf4 02 06 a8 7c     ADD        AL,byte ptr [0x7ca8]
       0000:7cf8 32 06 cf 7c     XOR        AL,byte ptr [0x7ccf]
       0000:7cfc 3a 07           CMP        AL,byte ptr [BX]
                             LAB_0000_7cfe+1
       0000:7cfe 75 0a           JNZ        LAB_0000_7d0a
       0000:7d00 43              INC        BX
       0000:7d01 49              DEC        CX
       0000:7d02 83 f9 00        CMP        CX,0x0
       0000:7d05 7e 02           JLE        LAB_0000_7d09
       0000:7d07 eb e7           JMP        LAB_0000_7cf0

La fonction prend l’entrée clavier (INT 0x16) et compare (c + *0x7ca8) ^ *0x7ccf avec la chaîne à l’adresse 0x7cab de longueur *0x7ca9. On peut afficher le contenu avec GDB:

(gdb) x/1bd 0x7ca8
0x7ca8: 13
(gdb) x/1bd 0x7ca9
0x7ca9: 36
(gdb) x/1bd 0x7ccf
0x7ccf: 6
(gdb) x/s 0x7cab
0x7cab: "C;FC9tti<tw@E<G8CB<hEFw<FEuDv@@@vEv;\006\035\tW5\030\030\003\036\031\020W\264\002\210", <incomplete sequence \360\265>

Avec strings on voit que le binaire dit “Use FLAG{md5(password)} to validate the challenge”

La solution:

In [1]: s = b'C;FC9tti<tw@E<G8CB<hEFw<FEuDv@@@vEv;'

In [2]: bytes((c ^ 6) -13 for c in s)
Out[2]: b'80382eeb-ed96-4187-a63d-36f5c999c6c0'

In [3]: from hashlib import md5

In [4]: md5(b"80382eeb-ed96-4187-a63d-36f5c999c6c0").hexdigest()
Out[4]: '0556c6f9afbb5038a7c52e37ec09c993'

FLAG{0556c6f9afbb5038a7c52e37ec09c993}