Konfiguriert gcc während der Kompilierzeit lokale Variablen?

8

Ich lese gerade (zum zweiten Mal) "Hacking: Die Kunst der Ausbeutung" und bin über etwas gestolpert.

Das Buch schlägt zwei verschiedene Möglichkeiten vor, um diese beiden ähnlichen Programme zu nutzen: auth_overflow und auth_overflow2

Im ersten Fall gibt es eine Passwortüberprüfungsfunktion, die wie folgt ausgelegt ist:

%Vor%

Wenn Sie mehr als 16 ASCII-Zeichen eingeben, wird der Wert von auth_flag auf einen Wert größer als 0 gesetzt, wodurch die Prüfung umgangen wird, wie in dieser gdb-Ausgabe gezeigt:

%Vor%

Das zweite Programm invertiert die zwei Variablen:

%Vor%

Der Autor schlägt dann vor, dass es nicht möglich ist, in auth_flag überzulaufen, was ich wirklich glaubte. Ich fuhr dann fort, den Puffer überzulaufen, und zu meiner Überraschung funktionierte es noch. Die auth_flag-Variable saß immer noch hinter dem Puffer, wie Sie auf dieser gdb-Ausgabe sehen können:

%Vor%

Ich frage mich, ob gcc nicht lokale Variablen für Alignment / Optimierungszwecke neu anordnet.

Ich habe versucht, mit -O0 Flag zu kompilieren, aber das Ergebnis ist das gleiche.

Weiß einer von euch, warum passiert das?

Vielen Dank im Voraus.

    
rgehan 11.08.2016, 08:29
quelle

1 Antwort

11

Den Compilerautoren steht es völlig frei, ein Zuordnungsschema für lokale Variablen mit automatischem Speicher zu implementieren. auth_flag könnte vor oder nach password_buffer auf dem Stack gesetzt werden, es könnte sich in einem Register befinden, es könnte vollständig entfernt werden, wenn die richtige Analyse des Codes dies zulässt. Es könnte nicht einmal ein Stack sein ... Die einzige Garantie, die der Standard Ihnen gibt, ist diese:

strcpy(password_buffer, password); ruft undefiniertes Verhalten auf, wenn die Quellzeichenfolge einschließlich des Nullabschlusszeichens länger als das Zielarray password_buffer ist. Ob dieses undefinierte Verhalten Ihren Anforderungen entspricht, liegt außerhalb der Sprachspezifikation.

Tatsache ist, dass einige Implementierer die Aufgabe von Hackern absichtlich verkomplizieren, indem sie das Verhalten in Fällen wie dem veröffentlichten Code randomisieren.

    
chqrlie 11.08.2016, 09:03
quelle