2016-06-04 19 views
-1

Ich möchte eine Funktion Call-Stack pro Funktion implementieren. Daher muss ich einen (nicht zu kleinen) Speicherbereich verwenden, um die Kanarienvögel hineinzulegen (um den Stapelwert des Kanarienvogels gegen den anfänglichen Kanarienwert zu prüfen). Ich habe gesehen, dass GCC's Stack Protector den FS Speicher nutzt. Da braucht es nur einen sehr kleinen Speicherbereich (ich denke es ist ungefähr 5 ganze Größe). Ich habe auch gelesen, dass FS-Speicher für andere OS-Zwecke verwendet wird, daher muss ich offensichtlich versuchen, diese Zwecke nicht zu stören. Da ich einen per-Function-Call-Kanarienvogel implementiere, würde ich ein größeres Gedächtnis brauchen (Kanarienvögel sind 1 Wort groß und ich sollte in der Lage sein, mindestens 100 Kanarienvögel zu halten). Insgesamt bin ich gespannt, wo ich sie sicher stellen kann.Sicherer Speicherbereich für Stapelkanarien

+0

Sie legen keine Stapelkanarien in 'fs:', Sie legen sie auf den Stapel. – EOF

+0

yeah, aber du legst sie irgendwo in fs, um gegen den korrekten kanarischen Wert zu prüfen – Corn

+0

@Corn: Du könntest diese Frage verbessern, wenn du einige der Informationen von Kommentaren auf Ira's Antwort editierst, so ist das ein Schulprojekt, und tut es nicht t muss unbedingt effizient genug für den realen Einsatz sein. Und nur im Allgemeinen klar, was der Punkt ist, und wie Sie wollen, dass es funktioniert. Ich denke, Sie haben eine gute Frage, und es würde Stackoverflow zu einer besseren Seite machen, wenn Sie es aufräumen würden, so dass es zukünftigen Lesern klar ist, was genau gefragt wird. (d. h., bearbeiten Sie Ihre Frage neu und ich werde sie wahrscheinlich aufwerten.: P Vielleicht mehrere kleinere Absätze?) –

Antwort

2

Ich denke, Sie schlagen vor, GCC zu ändern, um eine andere Art von Stapel Kanarienvogel zu verwalten (hat es nicht schon einen?).

Schlägst du vor, einen "parallelen" Pseudo-Stack mit dem PSU-Stapelzeiger, der über FS erreichbar ist, am Haupt-Stack zu belassen? Das ist einfach genug, um den Thread-lokalen Speicher zu implementieren, auf den über FS zugegriffen werden kann. Aber warum? Warum kannst du den Stack Canary nicht in den Stack legen, der für den Funktionsaufruf reserviert wurde?

Ich baue einen Compiler (nichts mit GCC zu tun), der Stapelkanarien hat. Er weist Speicherplatz ganz unten in jedem Stapelrahmen zu, um einen kanarischen Wert zu speichern (eine Konstante, aber Sie könnten einen Wert machen, der von der Definition der Funktion abgeleitet wird). Da der Compiler den (Funktionsaufruf-/Exit-) Code erzeugt, kann er beim Funktionseintrag die Kanarienkonstante in den Stapelrahmen schreiben, und beim Beenden kann er einen Test gegen einen Sofortwert für dieselbe Konstante gegen den Kanarienvogel im Stapel hinzufügen . Es gibt keinen Bedarf für einen parallelen Stapel oder irgendeine spezielle Verwendung von FS oder irgendeinem anderen Register, um Stapelkanarien auf diese Weise zu implementieren.

+0

ja Sie haben Recht. Ich dachte wirklich nicht darüber nach, den kanarischen Wert ganz unten in jeden Stapelrahmen zu setzen. Ich werde es ausprobieren und vielleicht sehen, ob ich noch weitere Fragen habe. thx – Corn

+0

in Bezug auf Ihre Frage von gcc Stapel Kanarienvogel. Ja, sie haben einen, aber der Stapelkanarienvogel ist global afaik. Das bedeutet, dass Sie für jede Funktion denselben Wert haben. Meine Implementierung hat einen individuellen Kanarienvogel für jeden Funktionsaufruf, der sicherer ist. Dies ist jedoch eine universitäre Aufgabe und nicht wirklich gedacht, GCC's Stack Kanarienvogel zu ersetzen – Corn

Verwandte Themen