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?
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
Willkommen in SO und +1 für den eloquenten Wortlaut. – Potatoswatter
Ich frage mich, warum Potatoswatter seinen Kommentar nicht als Antwort geschrieben hat ... –