Was ist ein Sicherheits-Cookie in C ++?

8

Ich habe von Google gelesen, dass es für die Kontrolle von Pufferüberläufen auf Anwendungsebene verwendet wird und von CRT aufgerufen wird. Es sagt auch, dass

"Im Wesentlichen wird der Cookie beim Eintritt in eine überlaufgeschützte Funktion auf den Stack gelegt, und beim Beenden wird der Wert auf dem Stack mit dem globalen Cookie verglichen. Jeder Unterschied zwischen ihnen gibt an, dass ein Pufferüberlauf aufgetreten ist und führt zur sofortigen Beendigung des Programms. "

Aber ich konnte nicht viel verstehen, wie es funktioniert? Bitte helfen.

    
Bhupesh Pant 13.11.2013, 04:43
quelle

2 Antworten

16

Der "Cookie" ist im Grunde nichts anderes als ein beliebiger Wert.

Die Grundidee ist also, dass Sie den gewählten Wert auf den Stapel schreiben, bevor Sie eine Funktion aufrufen. Obwohl es wahrscheinlich kein sehr guter Wert ist, wählen wir willkürlich 0x12345678 als Wert.

Dann ruft es die Funktion auf.

Wenn die Funktion zurückkehrt, kehrt sie an die richtige Stelle im Stapel zurück und vergleicht diesen Wert mit 0x12345678. Wenn sich der Wert geändert hat, bedeutet dies, dass die Funktion, die aufgerufen wurde, außerhalb des Bereichs des Stapels geschrieben hat, in dem sie schreiben darf, sodass sie (und dieser Prozess im Allgemeinen) als nicht vertrauenswürdig eingestuft wird und heruntergefahren wird.

In diesem Fall wählt das System anstelle von 0x12345678 regelmäßig einen anderen Wert, z. B. bei jedem Systemstart. Dies bedeutet, dass es weniger wahrscheinlich ist, den richtigen Wert zufällig zu treffen - es könnte einmal passieren, aber wenn es dort einen spezifischen Wert schreibt, wenn sich der richtige / gewählte Wert ändert, wird es den falschen Wert schreiben und Das Problem wird erkannt.

Es ist wahrscheinlich auch erwähnenswert, dass diese Grundidee nicht besonders neu ist. Nur zum Beispiel, in den MS-DOS-Tagen, würden sowohl die Compiler von Borland als auch von Microsoft einige bekannte Werte ganz unten auf dem Stapel schreiben, bevor Sie in Ihrem Programm main aufrufen. Nachdem main zurückgegeben wurde, wird der Wert erneut überprüft. Es würde dann eine Fehlermeldung (rechts beim Beenden des Programms) ausgeben, wenn der Wert nicht dem entspricht, was erwartet wurde.

    
Jerry Coffin 13.11.2013, 04:49
quelle
7

Es ist genau, was die Erklärung sagt, aber Sie können "Plätzchen" durch "etwas Wert" ersetzen. Wenn die Funktion aufgerufen wird, legt sie einen Wert auf dem Stapel ab. Wenn die Funktion zurückkehrt, wird sie erneut überprüft, um festzustellen, ob sie sich geändert hat.

Das normale Verhalten der Funktion besteht darin, den Speicherplatz nicht zu berühren. Wenn sich der Wert dort ändert, bedeutet dies, dass der Funktionscode sie irgendwie überschrieben hat, was bedeutet, dass ein Pufferüberlauf aufgetreten ist.

    
zneak 13.11.2013 04:48
quelle

Tags und Links