Vorbereitung Vortrag zu Bufferoverflow Problem Vorführung in Ubuntu 12.04
-
Hallo c-community,
ich bereite für mein Studium einen Vortrag zu Bufferoverflows vor. Ich habe auch einige Tutorials gefunden und kann diese im gdb/ddd unter Ubuntu 12.04 nachvollziehen.
Jetzt habe ich aber folgendes Problem: im ddd (grafische Oberfläche für gdb) kann ich mit set args einen string setzen (AAAAAAAAAAAAAAAAAAAA\x39\x84\x04\x08) und dadurch eine Funktion aufrufen, die eigentlich nicht verwendet wird (Startadresse 0x08048439). Wenn ich den gleichen String auch einfach im Terminal dem angreifbaren Programm übergebe, dann wird kommt zwar ein Seg-Fault, wie gewünscht, aber die Funktion wird nicht wie im ddd aufgerufen.
Hat Ubuntu trotz kompilieren mit "gcc fno-stack-protector" im normalen Betrieb (Aufruf Programm im Terminal) die Schutzfunktionen aktiv? Also schützt Ubuntu 12.04 trotzdem das EIP-Register und nur ddd erlaubt es mir? Kann ich diesen Schutz eventuell temporär (ich weiß, dies ist etwas gefährlich ^^) deaktivieren?
Hoffe jemand kann mir hier helfen, dies Frage zu beantworten.
MfG
mirrowwinger
-
mirrowwinger schrieb:
Hat Ubuntu trotz kompilieren mit "gcc fno-stack-protector" im normalen Betrieb (Aufruf Programm im Terminal) die Schutzfunktionen aktiv?
Ganz sicher nicht.
Für konkretere Antworten: Gib Code.
-
Also hier der Code:
#include <stdio.h> #include <string.h> void func(char* origin) { char buffer[8]; strcpy(buffer, origin); printf("%s\n",buffer); } void bar() { printf("Never seen!\n"); } int main(int argc, char* argv[]) { if (argc <= 1) { printf("No argument given!\n"); return -1; } func(argv[1]); return 0; }
Kurze Erklärung: Main führt die Funktion func aus, in der ein string in einen begrenzten Buffer kopiert wird ohne Längenüberprüfung. Der kopierte String ist das argv[1] welcher im ddd mit dem String AAAAAAAAAAAAAAAAAAAA\x39\x84\x04\x08 ein Ausführen der bar-Funktion erzwingt, die eigentlich nie verwendet wird. Mit ddd habe ich die Startadress für die bar-Funktion ausgelesen, die bei 0x08048439 liegt.
Hoffe das hilft weiter.
-
Hallo,
bist du sicher, daß die Adressen immer gleich sind (also per ddd und per Terminal)?
Laß dir doch einfach mal die Adresse von 'buffer' per printf ausgeben.
-
Also die Adresse von buffer ändert sich. Muss ich also adress space layer randomizing (aslr) noch ausschalten?
echo 0 > /proc/sys/kernel/randomize_va_space
Geht das nur global oder kann ich das auch nur für das Beispielprogramm machen?
mirrowwinger
-
Das ist doch eine Demo-Progrmm.
Lass dir doch vom Programm den richtigen String ausgeben.Und wenn du das über argv steuerst, kannst du das vorher ausprobieren ohne das jemand die Ausgabe sieht.
-
Also ich hab da heute mal ein wenig getestet. Folgendes Verhalten habe ich beobachtet, aber verstehe es noch nicht gänzlich. Vieleicht kann mir von euch da jemand helfen.
Also auch im ddd klappt es nicht, wenn ich den String direkt mit 20 x "A" + Adresse bar() direkt vorgebe. Wenn ich aber den String durch Perl erzeuge:
set args `perl -e 'print "A" x 20 . "\x39\x84\x04\x08"'`
dann funktioniert alles.
Erste Frage ist, wie kann ich das Argument im Terminal erzeugen? hab folgendes versucht:
perl -e 'print "A" x 20 . "\x39\x84\x04\x08"' > ./vulnerableProgramm
gibt folgenden Fehler aus:
bash: ./vulnerableProgramm: Text file busy
Die 2. Frage ist, was ist der Unterschied zwischen den beiden Eingaben?
mirrowwinger
-
perl -e 'print "A" x 20 . "\x39\x84\x04\x08"' > ./vulnerableProgramm
So geht das nicht mit den Pipes. Du versuchst da die Ausgabe von
perl -e 'print "A" x 20 . "\x39\x84\x04\x08"'
in eine Datei namensvulnerableProgramm
zu schreiben. Du meinst wohl eherARGUMENT=`perl -e 'print "A" x 20 . "\x39\x84\x04\x08"'` ; ./vulnerableProgramm "$ARGUMENT"
Das wird aber immer noch nicht funktionieren, da die Zeichenkette zwischendurch noch einmal durch den Kommandoprozessor geht. Du musst die Zeichenkette für diesen noch einmal escapen. Glaube ich zumindest, bin da nicht ganz der Experte für. Schreib dir mal ein kleines Testprogramm, welches argv[1] als Reihe von ASCII-Werten ausgibt und spiel ein bisschen mit den verschiedenen Möglichkeiten herum. Oder stell eine entsprechende Fragen in "Themen rund um den PC".
P.S.: "Programm" schreibt man im Englischen "program", mit einem 'm'.
-
Hätte gar nicht so weit weg schauen sollen, habe mir anstelle des Shell-Scriptes jetzt das Gegenstück in C programmiert und lasse den vollständigen String mit system ausführen. Funktioniert wunderbar.