Outils d'utilisateurs

Outils du Site


hackingweek_2014:reverse:reverse2

Reverse 2

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$
hackingweek_2014/reverse/reverse2.txt · Dernière modification: 2017/04/09 15:33 (modification externe)