Warum hat diese Speicheradresse %fs:0x28 ( fs[0x28] ) einen zufälligen Wert haben?

Lesezeit: 2 Minuten

Benutzeravatar von Dr.Knowitall
Dr.Knowitall

Ich habe ein Stück C-Code geschrieben und es zerlegt sowie die Register gelesen, um zu verstehen, wie das Programm in Assembler funktioniert.

int test(char *this){
    char sum_buf[6];
    strncpy(sum_buf,this,32);
    return 0;
}

Der Teil meines Codes, den ich untersucht habe, ist die Testfunktion. Wenn ich die Ausgabe meiner Testfunktion zerlege bekomme ich …

   0x00000000004005c0 <+12>:        mov    %fs:0x28,%rax
=> 0x00000000004005c9 <+21>:        mov    %rax,-0x8(%rbp)
... stuff ..
   0x00000000004005f0 <+60>:        xor    %fs:0x28,%rdx
   0x00000000004005f9 <+69>:        je     0x400600 <test+76>
   0x00000000004005fb <+71>:        callq  0x4004a0 <__stack_chk_fail@plt>
   0x0000000000400600 <+76>:        leaveq 
   0x0000000000400601 <+77>:        retq 

Was ich wissen möchte ist was mov %fs:0x28,%rax macht wirklich?

  • Siehe auch: stackoverflow.com/questions/1345670/stack-smashing-detected

    – Ciro Santilli OurBigBook.com

    17. August 2018 um 14:53 Uhr

  • Okay, das macht Sinn. Wie könnte ich diese Adresse und diesen Wert mit gdb lesen?

    – Dr.Knowitall

    26. April 2012 um 1:18 Uhr

  • Am einfachsten ist es, sich den Inhalt des RAX-Registers direkt nach der MOV-Operation anzusehen.

    – Jason

    26. April 2012 um 1:37 Uhr

  • Die segmentierte Adressierung wird nicht mehr verwendet — das stimmt nicht, die segmentierte Adressierung wird immer noch zu 100% verwendet, obwohl sich die Verwendung verschoben hat dramatisch anstatt eines Segments ein virtueller Raum zu werden. Da wir den gesamten Speicher mit einem einzigen Register in 64 Bit adressieren können (obwohl in den meisten Fällen nur 48 verwendet werden), ändern wir diese Register nicht, aber sie sind wirklich wichtig in Verbindung mit der MMU und den Speicherschutzschemata.

    – Alexis Wilke

    21. November 2020 um 15:40 Uhr

  • Hey, ich weiß, das ist wirklich alt, aber ich wollte nur fragen, warum das so ist %fs:0x28 muss durch rax und dann zum Stack hinzugefügt werden? Warum können wir es nicht direkt hinzufügen wie mov %fs:0x28, -0x8(%rbp)?

    – Need_to_know_now

    16. April 2021 um 5:41 Uhr

  • @need_to_know_now: Das wäre eine Speicher-zu-Speicher-Bewegung, und x86 hat keine solche Anweisung. Versuchen Sie, es zusammenzubauen, und Sie erhalten eine Fehlermeldung. Wenn Sie Speicher zu Speicher verschieben möchten, müssen Sie in ein Register laden und dann mit einer zweiten Anweisung speichern.

    – Nate Eldredge

    12. Juni 2021 um 23:23 Uhr

  • Das ist einfach nicht richtig. fs ist kein “normales” Register. Es ist ein Segmentregister. Im geschützten Modus fs ist ein Wähler in die GDT. Es gibt versteckte “Basis”- und “Grenz”-Register, die damit verbunden sind, die Sie nicht sehen können. So fs:0x28 ist wirklich [hidden_fs_base + 0x28].

    – Jonathon Reinhart

    21. Januar 2013 um 8:24 Uhr

1408920cookie-checkWarum hat diese Speicheradresse %fs:0x28 ( fs[0x28] ) einen zufälligen Wert haben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy