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;
}
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?