Executable : https://repo.zenk-security.com/hackingweek2014_ctf/crackme-02
$ file crackme-02 crackme-02: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.32, dynamically linked (uses shared libs), stripped
Le crackme 2 est un ELF 32 bits basique.
Dans celui-ci, le code effectuant la comparaison de mot de passe est xoré avec une clé 0xAA.
LOAD:08048521 mov esi, offset loc_804853F LOAD:08048526 mov edi, esi LOAD:08048528 mov ecx, 13h LOAD:0804852D LOAD:0804852D loc_804852D: ; CODE XREF: sub_80484E5+4Cj LOAD:0804852D lodsb LOAD:0804852E xor al, 0AAh LOAD:08048530 stosb LOAD:08048531 loop loc_804852D
L'idéal est alors ici d'utiliser gdb pour laisser le programme s'auto-déchiffrer, et breaker juste après la boucle.
$ gdb ./crackme-02 gdb$ b *0x8048533 Breakpoint 1 at 0x8048533 gdb$ r Starting program: /home/fab/Downloads/crackme-02 Enter password: AAAA --------------------------------------------------------------------------[regs] EAX: 0x00000000 EBX: 0xF7FA1FF4 ECX: 0x00000000 EDX: 0x00000004 o d I t s Z a P c ESI: 0x08048552 EDI: 0x08048552 EBP: 0xFFFFCD2C ESP: 0xFFFFCD2C EIP: 0x08048533 CS: 0023 DS: 002B ES: 002B FS: 0000 GS: 0063 SS: 002B --------------------------------------------------------------------------[code] => 0x8048533: mov esi,0x8048481 0x8048538: mov edi,0x8048549 0x804853d: mov ecx,edx 0x804853f: lods al,BYTE PTR ds:[esi] 0x8048540: dec al 0x8048542: scas al,BYTE PTR es:[edi] 0x8048543: jne 0x804856d 0x8048545: loop 0x804853f -------------------------------------------------------------------------------- Breakpoint 1, 0x08048533 in ?? () gdb$
Le code déxoré laisse apparaitre une comparaison entre notre mot de passe entré et une chaine en 0x8048549, en prenant soin de décrémenter chaque caractère de notre entrée.
gdb$ x/1s 0x8048549 0x8048549: "Hu5nBa1T"
La solution consiste alors à regarder la valeur de la chaine, en incrémentant chaque caractère.
$ python -c "print ''.join(chr(ord(k)+1) for k in 'Hu5nBa1T')" Iv6oCb2U
$ ./crackme-02 Enter password: Iv6oCb2U sh-4.2$