Problem mit Puffer Überlauf

Hallo,
ich hab vor kurzem mal wieder das Buch das Buch "Hacking - Die Kunst des Exploits" von Jon Erickson ausgegraben und bin jetzt im Kapitel über Exploits angelangt, genauer gesagt beim Pufferüberlauf und bin dabei das Beispiel mit dem fehlerhaften Login System angelangt.
Mein Problem liegt weniger im Verständnis (Bei jedem Aufruf einer Funktion wird ein Stack erzeugt, auf den Werten dann nacheinander das Passwort Argument der Funktion, die Rücksprung Adresse, der gesicherte Frame Pointer, die Flag Variable vom Typ Integer und der Puffer drauf geworfen ).
Das Programm kompiliert soweit und funktioniert an sich einwandfrei (der Pufferüberlauf an sich auch), wenn ich meinen Code nun mit GDB debugge, liefert er mir jedoch nicht das erwartete Ergebnis (kompiliert und debugged wird auf meiner Raspberry Pi B Version mit Wheezy als OS).

Ich habe den ersten Breakpoint vor die "strcpy(pwbuffer, password);" Anweisung gesetzt und den 2. vor die Rückgabe der flag Variable :

Der Code (die Variablen Namen unterscheiden sich zu denen aus dem Buch) :

Wie erwartet hatte die flag Variable vor dem ersten Haltepunkt den Wert 0 (dieser wurde logischerweise oben zugewiesen) und der Puffer war mit zufälligen Zeichen befüllt.
als Konsolen Parameter hab ich 30* "A" (ausgeschrieben) angegeben gehabt;
Bei 2 Kompilierversuchen stellten sich 2 mir seltsam erscheinende Ergebnisse ein :
Beim ersten mal schien am Puffer noch ein Byte mit dem Wert "\001" (pwbuffer schrieb sich als String als "A" repeats 16 times ."\001" aus) angehängt zu sein und dieses Byte lief dann auch in die Flag Variable über (ich gehe davon aus, dass das an irgendeinem Zeichensystem liegen könnte???).
Als ich den Code erneut kompilierte schien alles recht normal zu sein, bis ich mir den Passwortpuffer am 2. Haltepunkt ansah (16 Hexadezimal Wörter) :

Code:
0x41414141 0x41414141 0x41414141 0x41414141
0x00000001 0x41414141 0x41414141 0xbe004141

Die erste Zeil sieht recht normal aus, aber ich hätte erwartet, dass der Puffer ganz normal in die Flag Variable überläuft (hier hat sie aber den Wert 0x00000001). Woran liegt das ?
Danke für eure Hilfe

Code:
#include<stdio.h>
#include<string.h>
int check(char *password){
    int flag = 0; 
    char pwbuffer[16]; // Puffer der überlaufen soll
    strcpy(pwbuffer, password); // Hier soll der Überlauf stattfinden  
    
    if(strcmp(pwbuffer,"passwort") == 0){
       flag = 1; // Passwort korrekt 
    }
    return flag; // Sollte in diesem Fall den Wert 0x004141 (16) haben
}
int main(int argc, char *argv[]){ 
    printf("Login System\n\n");
    if(check(argv[1])){
      printf("***********************\n");
      printf("*  Zugang gewährt     *\n");
      printf("***********************\n");
    }   
    else {
      printf("***********************\n");
      printf("*  Zugang verweigert  *\n");
      printf("***********************\n");
    } 
}
 
Zuletzt bearbeitet:
Zurück
Oben