Buffer Overflow

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
pac89
Beiträge: 8
Registriert: 17.11.2012 02:14:16

Buffer Overflow

Beitrag von pac89 » 17.11.2012 02:51:36

hallo,

ich beschäftige mich seit geraumer Zeit mit Buffer Overflows wegen einer Facharbeit, an der ich grad sitze. Um das Thema besser nachzuvollziehen, lese ich gerade ein Buch darüber, in denen anhand von Beispielcodes das thema erläutert wird. Dazu habe ich mir auf der Virtualbox das Betr.system Debian installiert und versuche die Codefragmente ausm buch zu tippen zu denen auch das folgede gehört:

Code: Alles auswählen

// serial.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int valid_serial( char *psz )
{
   size_t len = strlen( psz );
   unsigned total = 0;
   size_t i;

   if( len < 10 )
      return 0;

   for( i = 0; i < len; i++ )
   {
      if(( psz[i] < '0' ) || ( psz[i] > 'z' ))
         return 0;

      total += psz[i];
   }

   if( total % 853 == 83 )
      return 1;

   return 0;
}

int validate_serial()
{
   char serial[ 24 ];

   fscanf( stdin, "%s", serial );

   if( valid_serial( serial ))
      return 1;
   else
      return 0;
}

int do_valid_stuff()
{
   printf("The serial number is valid!\n");
   // do serial-restricted, valid stuff here.
   exit( 0 );
}

int do_invalid_stuff()
{
   printf("Invalid serial number!\nExiting\n");
   exit( 1 );
}

int main( int argc, char *argv[] )
{
   if( validate_serial() )
      do_valid_stuff(); // 0x0804863c
   else
           do_invalid_stuff();

   return 0;
}


hierbei wird ein password eingelesen und auf seine korrektheit hin überprüft.
danach schaue ich mir mit dem befehl gdb disas main die adresse an der die funktion do_valid_stuff aufgerufen wird. Ziel ist es, das programm dazu zu bewegen bei jeder eingabe des Passworts die Nachricht The serial number is valid!. das soll dadurch geschehen, dass ich die RET-Adresse durch die Adresse der do_valid_stuff adresse ersetze.

ich mache das mit folgendem befehl
printf "AAAAAABBBBBBAAABABABABA\x93\x08\x04\x86" | ./serial


dabei wird die adresse der fkt. do_valid_stuff rückwärts eingelesen. daher kommt das x93\x08\x04\x86 her. in dem buch steht jetzt aber die meldung The serial number is valid! was ja erscheinen soll. aber bei mir kommt die fehlermeldung "Speicherzugriffsfehler", obwohl ich alles wie im buch gemacht habe. wieso kommt das? kann mir das jmd. erklären?

storm
Beiträge: 1581
Registriert: 01.05.2004 13:21:26
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: DE

Re: Buffer Overflow

Beitrag von storm » 18.11.2012 23:33:21

Also erstmal erscheint mir der String, der in den Buffer soll, genau um ein Zeichen zu kurz. Und die Adresse erscheint mir auch nicht koscher. Von den zwei Sachen abgesehen, kommt es natürlich noch drauf an, ob dein kernel eventuell mit Schutzmaßnahmen arbeit bzw. ob dein compiler vielleicht stack-protector per default einsetzt.
Eigentlich musst du unmittelbar nach dem Aufruf von valid_serial in den registern sehen, ob das Überschreiben funktioniert hat und da die richtige Adresse drin steht (gdb/ddd).
drivers/ata/libata-core.c: /* devices which puke on READ_NATIVE_MAX */

Antworten