Warum kommt die int Variable nicht vor char Array in Bezug auf die Adressierung, egal wie ich sie in C codiere?

8

Ich lese Hacking: Die Kunst der Ausbeutung (2. Ausgabe) , und ich bin gerade im Abschnitt über Pufferüberläufe.

Im ersten Beispiel werden die Variablen in dieser Reihenfolge deklariert / initialisiert:

%Vor%

Im Beispiel wird erklärt, dass Sie mit gdb die Adressen von auth_flag und password_buffer untersuchen können, und Sie werden feststellen, dass die Adresse von auth_flag höher ist als password_buffer . Dinge zu beachten: Ich benutze all dies in Ubuntu in Virtualbox auf einem Macbook Pro (Intel-Prozessor, 64-Bit).

Ich habe den Code des ersten Beispiels wie folgt kompiliert: gcc -g -fno-stack-protector -o auth_overflow auth_overflow.c

Wie erwartet, ist die Adresse von auth_flag höher als password_buffer .

Um das oben dargestellte Problem zu beheben, erklärt der Autor, dass Sie die Reihenfolge der Deklarationen wechseln sollten:

%Vor%

Ich habe den Code auf die gleiche Weise kompiliert: gcc -g -fno-stack-protector -o auth_overflow2 auth_overflow2.c

Leider konnte ich nicht sehen, dass auth_flag s Adresse niedriger ist als password_buffer s. Tatsächlich war es noch höher. Warum ist das? Was mache ich falsch?

    
JoeB 14.08.2010, 03:50
quelle

4 Antworten

5

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

    
Karl Bielefeldt 14.08.2010 04:03
quelle
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.

    
Zan Lynx 14.08.2010 04:00
quelle
0

Ich fand diesen Thread ziemlich interessant:

Ссылка

Quote: In der Theorie kann es gemacht werden

%Vor%     
karlphillip 14.08.2010 04:08
quelle
0

Apple hat eine Sicherheitsfunktion, um nur die Art von Hacking zu verhindern, über die Sie sprechen - Es gibt einen Grad der Randomisierung, bei dem alles im Speicher gespeichert wird, so dass Sie beispielsweise den für ein bestimmtes Programm zugewiesenen Speicher nicht finden können. und gehen Sie zum 1502. Byte, wo die Funktion zum Öffnen der Hochsicherheitsverriegelungsverriegelung sitzt, weil sie nicht immer an der gleichen Stelle im Speicher ist.

Siehe Ссылка für Einzelheiten dazu.

Lustiger Zufall, dass Sie dem begegnen würden, und dass Matt Joiner auf die Antwort stolpern würde, während er versucht, Apple zu verbrennen.

    
Alex Gosselin 14.08.2010 04:35
quelle

Tags und Links