wie Sie wissen, Ort der return-Adresse auf stack c/c++

ich lese über eine Funktion, die überschrieben werden kann, seine Adresse zurück.

void foo(const char* input)
{
    char buf[10];

    //What? No extra arguments supplied to printf?
    //It's a cheap trick to view the stack 8-)
    //We'll see this trick again when we look at format strings.
    printf("My stack looks like:\n%p\n%p\n%p\n%p\n%p\n% p\n\n"); //%p ie expect pointers

    //Pass the user input straight to secure code public enemy #1.
    strcpy(buf, input);
    printf("%s\n", buf);

    printf("Now the stack looks like:\n%p\n%p\n%p\n%p\n%p\n%p\n\n");
}  

War es sugggested, dass dies ist, wie der stack Aussehen würde

Adresse von foo = 00401000

Mein stack sieht so aus:

00000000

00000000

7FFDF000

0012FF80

0040108A <-- Wir wollen die Rücksprungadresse zu überschreiben für foo.

00410EDE

Frage:

-. Warum hat der Autor willkürlich wählen Sie die zweite letzten Wert wie die return-Adresse von foo()?

-. Sind die Werte, die dem Stapel Hinzugefügt von unten oder von oben?

  • neben der Funktion return Adresse, was sind die anderen Werte, die ich anscheinend auf dem Stapel angezeigt? dh warum ist es nicht mit Nullen gefüllt

Dank.

  • Es hängt von der CPU (- Familie), die Sie verwenden, und auch auf dem ABI. Sie sollten wahrscheinlich tag, Ihre Frage angemessen, so dass es klar, was du hier redest (ich vermute x86 auf Linux oder Windows ?).
  • Es kommt auch auf den compiler an. Neuere Versionen von Visual Studio und GCC die Reihenfolge der Stapel, um solche Angriffe schwieriger. Wenn buf befindet sich nach der Rückkehr-Adresse, brauchen Sie einen pufferunterlauf, die Rücksprungadresse zu überschreiben. Und unter-sind sehr viel seltener.
InformationsquelleAutor Dr Deo | 2010-04-19
Schreibe einen Kommentar