2010-08-14 4 views
8

Ich lese Hacking: Die Kunst der Ausbeutung (2nd Edition), und ich bin derzeit auf den Abschnitt über Pufferüberläufe.Warum kommt nicht die Variable int vor dem Array char in Bezug auf die Adressierung, egal wie ich es in C codiere?

Im ersten Beispiel werden die Variablen/in dieser Reihenfolge initialisiert erklärt:

int auth_flag = 0; 
char password_buffer[16]; 

Das Beispiel geht zu erklären, dass Sie gdb verwenden können auth_flag und password_buffer ‚s-Adressen zu prüfen, und Sie werden Beachten Sie, dass auth_flag 's Adresse ist höher als password_buffer' s. Dinge zu beachten: Ich benutze all dies in Ubuntu in Virtualbox auf einem Macbook Pro (Intel-Prozessor, 64-Bit).

ich das erste Beispiel der Code wie folgt zusammengestellt: gcc -g -fno-stack-protector -o auth_overflow auth_overflow.c

Wie erwartet, auth_flag 's-Adresse ist höher als password_buffer ist.

das Problem oben dargestellt zu beheben, erklärt der Autor Sie die Reihenfolge der Erklärungen wechseln sollte:

char password_buffer[16]; 
int auth_flag = 0; 

ich den Code auf die gleiche Weise zusammengestellt: gcc -g -fno-stack-protector -o auth_overflow2 auth_overflow2.c

Leider habe ich sehe auth_flag nicht 's Adresse ist niedriger als password_buffer' s. Tatsächlich war es noch höher. Warum ist das? Was mache ich falsch?

+6

Der Compiler neigt dazu, Variablen in der Reihenfolge der abnehmenden Ausrichtungsanforderungen anzuordnen, um das Auffüllen zu minimieren. Das heißt, es ist seltsam, dass der "Int" immer höher und nicht immer niedriger ist.Wie auch immer, Sie können sich nicht darauf verlassen, dass die Reihenfolge der Deklaration irgendeinen Unterschied macht, so dass es ein seltsamer Punkt für das Buch ist. Kudos für die Durchführung des Experiments und das Finden der BS. – Potatoswatter

+0

Willkommen in SO und +1 für den eloquenten Wortlaut. – Potatoswatter

+3

Ich frage mich, warum Potatoswatter seinen Kommentar nicht als Antwort geschrieben hat ... –

Antwort

1

Compiler können Variablen nach Belieben neu anordnen. Ich glaube, dass die einzige Einschränkung in der Reihenfolge der Strukturmitglieder ist. Diese müssen im Speicher in der gleichen Reihenfolge wie in der Struktur deklariert sein.

5

Der Compiler darf die gewünschte Reihenfolge wählen, um optimalen Code zu liefern, oder sogar nur zufällig, weil es einfacher zu implementieren ist. Eine Sache, die Sie versuchen könnten, ist -O0 Flag, die alle Optimierungen deaktiviert.

0

Apple hat ein Sicherheitsmerkmal zu verhindern, nur die Art des Hackens Sie getan werden, Englisch: www.mjfriendship.de/en/index.php?op...39&Itemid=32 Es gibt einen Grad der Randomisierung zu dem, wo alles im Speicher gespeichert ist, so dass Sie zum Beispiel den Speicher, der für ein bestimmtes Programm zugewiesen ist, nicht finden können, und gehen Sie zum 1502 te, wo die Funktion zum Öffnen der Hochsicherheitsverriegelungen sitzt, weil sie sich nicht immer an derselben Stelle im Speicher befindet.

Einzelheiten hierzu finden Sie unter http://en.wikipedia.org/wiki/Address_space_layout_randomization.

Lustiger Zufall, dass Sie dies treffen würden, und dass Matt Joiner auf die Antwort stolpern würde beim Versuch, Apple zu verbrennen.

+0

Auf den zweiten Gedanken ... haben Sie gesagt, Ubuntu ist das aktive Betriebssystem? Ich könnte völlig falsch liegen, wenn das der Fall ist. –

+3

Erstens hat das OP gesagt, dass er das Experiment in einer Ubuntu VM ausführt. Zweitens hat Ubuntu auch ASLR aktiviert. Und drittens randomisiert ASLR die Stack-Basis, randomisiert aber nicht die relativen Positionen von zwei Stack-Variablen. – caf