iCTF 2011 > Challenge 25 - Reverse 150
Pour ce challenge 25, on avait un exécutable ELF 32-bits qui affiche "Th31c7f2011i5n0ts0c0o0ol!". Le but est de patcher un byte pour qu'il sorte "Th31c7f2011i5s0c0o0ol!".
Le début de l'ELF à 0x80483f0 nous donne l'adresse de la fonction main : 0x80484a4 (qui dure jusqu'à 0x804867f). Cette fonction contient un ensemble de strcpy() et memcpy() des chaînes "whatwhat?", "s0c0o0ol!" et "Th31c7f2011i5n0t", à des adresses différentes.
On commence par repérer l'adresse utilisée pour l'impression sur la sortie standard, trouvée à la fin de la fonction :
8048661: lea 0x18(%esp),%eax 8048665: mov %eax,(%esp) 8048668: call 80483d8 <puts@plt>
La variable en question est donc à esp + 0x18. On cherche la dernière chaîne copiée à cette adresse :
804850d: mov $0x804a024,%eax 8048512: mov %eax,0x4(%esp) 8048516: lea 0x18(%esp),%eax 804851a: mov %eax,(%esp) 804851d: call 80483b8 <strcpy@plt>
0x804a024 correspond à "Th31c7f2011i5n0t". On cherche donc la concaténation qui amène à l'ajout de "s0c0o0ol!" (0x804a03f) qui est un peu plus loin :
8048576: movl $0x804a03f,(%esp) 804857d: call 80483a8 <strlen@plt> 8048582: lea 0x1(%eax),%edx 8048585: lea 0x18(%esp),%eax 8048589: add $0x10,%eax 804858c: mov %edx,0x8(%esp) 8048590: movl $0x804a03f,0x4(%esp) 8048598: mov %eax,(%esp) 804859b: call 8048398 <memcpy@plt>
Il suffit donc de modifier l'adresse de ce memcpy, qui est de base à esp + 0x18 + 0x10, vers esp + 0x18 + 0xd (pour enlever les trois caractères du n0t).
A coup de hexedit, on trouve que le 0x10 en question est à l'offset 0x58b et on le remplace par 0x0d.
On a donc la réponse du challenge : 58b-0d.
Ce n'est pourtant pas très compliqué, peut-être faut-il commencer par des choses plus simples. Par exemple, comprendre les bases de l'assembleur.
j'ai pas compris du tout