it-swarm.com.de

Wie sind Fettzeiger ein guter Schutz?

Ich lerne etwas über Pufferüberläufe und habe die Idee eines fetten Zeigers, aber was ich nicht ganz verstehe, ist, wie sie einen guten Schutz bieten. Wenn Sie den Zeiger so ändern könnten, dass er auf eine andere Adresse verweist, könnten Sie dann nicht die obj-Basis und den obj-Endabschnitt des fetten Zeigers so ändern, dass der Zeiger weiterhin gültig erscheint?

16
Pixel

Bei Pufferüberläufen geht es nicht darum, den Zeiger so zu setzen, dass er auf eine andere beliebige Adresse zeigt.

Ein Pufferüberlauf tritt auf, wenn eine Eingabe Ihr Programm veranlasst, eine scheinbar korrekte Operation auszuführen (z. B. "increment(): Bewegen Sie den Zeiger um 256 Bytes vorwärts"), so dass die Der Zeiger bewegt sich aus der beabsichtigten Datenstruktur/dem beabsichtigten Array in ein anderes Objekt.

Ein "Fettzeiger" enthält Informationen über die Datenstruktur/Arraygröße. Dies bedeutet, dass increment() Sicherheitsprüfungen in seinem Code haben kann, um sicherzustellen, dass sich der Zeiger innerhalb der entsprechenden Grenzen befindet. Sie benötigen noch Sicherheitsüberprüfungen irgendwo in Ihrem Code, aber damit können Sie ihn zentralisieren.

38
cloudfeet

Anscheinend denken Sie an die Art des Pufferüberlaufs, der normalerweise auf dem Heap auftritt. Dort werden die zugewiesenen Speicherblöcke normalerweise als Elemente mit Metadaten, die Zeiger auf das nächste und vorherige Element enthalten, in doppelt verknüpften Listen gespeichert. Theoretisch könnten Sie durch Überlaufen des Puffers die Metadaten des nächsten Speicherblocks überschreiben. Wenn dieser freigegeben wird, können Sie möglicherweise einen Funktionszeiger überschreiben, was zu einer beliebigen Codeausführung führt. Weitere Informationen zur Nutzung finden Sie auf dieser Website

Fette Zeiger könnten Sie davor schützen: Durch einfaches Überprüfen jeder Operation auf dem Array wie Lesen von oder Schreiben an den Speicherort wird intern eine Begrenzungsprüfung durchgeführt, ob der angegebene Versatz/Index gültig ist, und genau dann, wenn die Begrenzungen vorliegen Prüfung bestanden ist, wird die Operation ausgeführt. (Wie bereits bei @cloudfeet erwähnt.) Dies bedeutet, dass Sie nicht in der Lage sind, nach den Grenzen Ihres Speichers zu schreiben, und daher Dinge wie die Metadaten des nächsten Speicherblocks oder einen Zeiger auf dem Stapel nicht überschreiben können.

3
Sebastian Walla