Was ist ein Pufferüberlauf und wie verursache ich einen?
Ich habe gehört, über einen buffer overflow, und ich würde gerne wissen, wie zu verursachen.
Kann mir jemand zeigen, eine kleine Puffer-überlauf Beispiel?
Neue(Und wofür diese verwendet werden?)
InformationsquelleAutor der Frage H4cKL0rD | 2009-02-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen buffer overflow ist im Grunde, wenn eine gestaltete Abschnitt (oder Puffer) Speicher geschrieben wird, die außerhalb der vorgesehenen Grenzen. Wenn ein Angreifer es schafft, das geschehen von außerhalb ein Programm, es kann die Ursache für Probleme der Sicherheit, als könnte es potentiell erlauben, Sie zu manipulieren beliebigen Speicherbereichen, obwohl viele moderne Betriebssysteme Schutz gegen die schlimmsten Fälle.
Während sowohl das Lesen und schreiben außerhalb der vorgesehenen Grenzen werden allgemein als eine schlechte Idee, den Begriff "buffer overflow" ist in der Regel reserviert für schreiben außerhalb der Grenzen, da dies dazu führen kann, dass Angreifer leicht ändern, wie Ihr code ausgeführt wird. Gibt es einen guten Artikel auf Wikipedia über buffer overflows und die verschiedenen Möglichkeiten, Sie können verwendet werden, für die exploits.
In Bezug darauf, wie Sie Programm könnte man sich, es wäre eine einfache Sache:
Ob das kompiliert und was passiert, wenn es läuft würde wahrscheinlich hängt von Ihrem Betriebssystem und compiler.
InformationsquelleAutor der Antwort David Dean
Klassisches Beispiel für einen buffer-overflow:
Den buffer overflow allein macht meist nicht absichtlich geschehen. Es passiert oft, weil der eine so genannte "off-by-one" Fehler. Das heißt, Sie haben falsch berechnet, die array-Größe durch eine - vielleicht, weil Sie vergessen haben zu berücksichtigen, für ein abschließendes null-Zeichen, oder weil einige andere Sachen.
Aber es kann auch verwendet werden, für einige böse Sachen. In der Tat, der Benutzer lange wusste, dass dieses Loch, und fügt dann sagen 70 Zeichen, mit dem letzten, mit einigen speziellen bytes, die überschreiben einige stack-slot - wenn der Nutzer auch wirklich tricky, die er/Sie schlagen die return-Adresse slot im stack und überschreibt damit er springt nach vorne in die gerade eingefügt Puffer: Weil das, was der Benutzer eingegeben wurde, nicht seinen Namen, aber seine shell-code, den er zuvor kompiliert und warf aus. Der wird dann einfach ausgeführt. Es gibt einige Probleme. Zum Beispiel, Sie haben nicht zu vereinbaren zu haben eine "\n" in das Binär-code (da bekommt aufhören würde zu Lesen). Für andere Möglichkeiten, die Sauerei mit gefährlichen string-Funktionen, die binäre null ist problematisch, weil die string-Funktionen zu stoppen zu kopieren, es in den Puffer. Menschen haben
xor
mit zwei mal den gleichen Wert zu erzeugen, eine null zu, ohne zu schreiben eine null-byte-explizit.Sind die klassische Weg, es zu tun. Aber es gibt einige Blöcke Sicherheit sagen kann, dass solche Dinge passiert und andere Sachen, die machen den stack non-executable. Aber ich denke, da gibt es bessere tricks als ich eben erklärt habe. Einige assembler Mann könnte jetzt wahrscheinlich erzählen Sie lange Geschichten darüber 🙂
Wie es zu vermeiden
Immer verwenden Funktionen, die eine maximale Länge argument zu, wenn Sie nicht 100% sicher, dass ein Puffer ist wirklich groß genug. Spielen nicht solche Spiele wie "oh, die Nummer wird nicht mehr als 5 Zeichen" - es wird scheitern, irgendwann. Denken Sie daran, dass eine Rakete, bei der Wissenschaftler sagte, dass die Zahl nicht überschritten wird etwas Umfang, da die Rakete nie so schnell. Aber eines Tages, es war eigentlich schneller, und das Ergebnis war ein integer-überlauf und die Rakete abgestürzt (es geht um einen Fehler in Ariane 5einer der teuersten Fehler in der Geschichte).
Anstatt beispielsweise wird die Verwendung
fgets
. Und stattsprintf
verwendensnprintf
wo geeignet und verfügbar ist (oder nur den C++ - Stil Dinge wie istream und Zeug)InformationsquelleAutor der Antwort Johannes Schaub - litb
In der modernen linux-Betriebssystem, können Sie nicht die Ausnutzung von buffer-overflow-ohne irgendeine EXTRA-experiment.
warum ? weil Sie blockiert werden, indem ASLR (Adresse Stack Layer Randomization) und stack protector in diesem modernen GNU C-compiler. Sie werden nicht finden Speicher einfach, weil Speicher fallen in den random-Speicher, verursacht durch ASLR. und Sie wird blockiert durch stack protector, wenn Sie versuchen, überlauf das Programm.
Für den Anfang die Sie benötigen, um von ASLR 0
der Standardwert ist 2
in diesem Fall ist nicht über ALTE STIL buffer overflow tutorial können Sie aus habe internet. oder aleph one tutorial wird nicht mehr funktionieren in Ihrem system jetzt.
nun ein Programm Anfälligkeit für Pufferüberlauf-Szenario
sieht strcpy-Funktion ist gefährlich ohne stack-protector, da Funktion ohne zu prüfen, wie viele bytes wir input.
kompilieren mit extra option -fno-stack-protector dan -mpreferred-stack-boundary=2 for take off-stack-protector in Ihrem C-Programm
Puffer-überlauf C-Programm mit SUID-root-Zugriff scenatio jetzt haben wir es machen.
nun werden wir suchen, wie viele bytes wir brauchen, um in den buffer zu gemacht, ein Programm mit "segmentation fault"
sehen Sie, wir müssen 404 bytes Programm "segmentation fault" (crash) und wie viele bytes müssen wir überschreiben EIP ? EIP ist der instruction wird Sie ausgeführt nachdem. also hacker tun überschreiben EIP zum bösen Anweisung, was Sie wollen in das binary SUID auf dem Programm. wenn das Programm in die SUID-root, der Unterricht wird runned im root-Zugriff.
Programm hat segmentation fault code zurück. lassen Sie uns mehr input bytes und nehmen sehen, um EIP register.
wenig mehr
können Sie jetzt tun, der nächste Schritt...
InformationsquelleAutor der Antwort
Einen Puffer-überlauf ist nur das schreiben über das Ende eines Puffers:
InformationsquelleAutor der Antwort Tim Lesher
Zusätzlich zu dem, was bereits gesagt worden ist, im Hinterkopf behalten, dass Sie ' r-Programm kann oder kann nicht "Abstürzen", wenn ein buffer overflow Auftritt. Es sollte Absturz, und Sie sollten hoffen, dass es funktioniert - aber wenn der buffer overflow "überläuft" in eine andere Adresse, dass Ihre Anwendung auch zuordnen - kann die Anwendung normal zu arbeiten scheint für einen längeren Zeitraum.
Wenn Sie eine höhere edition von Microsoft Visual Studio - ich würde vorschlagen, über das neue sichere Entsprechungen in der stdlib, wie sprintf_s anstelle von sprintf, ect...
InformationsquelleAutor der Antwort NTDLS
Dies sollte genug, um es zu reproduzieren:
InformationsquelleAutor der Antwort alex2k8
Den "klassischen" buffer-overflow ist ein Beispiel:
Mit dem Sie spielen mit dem buffer-overflow-Parameter, und verändern Sie Sie zu Ihren Herzen Inhalt. Das Buch "Hacking - Die Kunst der Ausbeutung" (Link geht zu Amazon) geht ins detail darüber, wie zu spielen, um mit buffer overflows (rein als eine Intellektuelle übung natürlich).
InformationsquelleAutor der Antwort Larry Osterman
Wenn du überprüfen willst, ob du das Programm auf buffer overflows, Sie könnte es mit tools wie Valgrind. Sie finden einige Speicher-management-Fehler für Sie.
InformationsquelleAutor der Antwort John Smith
Dies ist eine Allgemeine Bemerkung über die Antworten, die Sie erhalten. Zum Beispiel:
Und:
Auf modernen Linux-Plattformen, dies funktioniert möglicherweise nicht wie erwartet oder beabsichtigt. Es kann nicht funktionieren, weil der FORTIFY_SOURCE Sicherheits-feature.
FORTIFY_SOURCE verwendet die "sicherere" Variante von high-risk-Funktionen wie
memcpy
undstrcpy
. Der compiler verwendet die sicherere Variante, wenn es ableiten kann, die Ziel-Puffer-Größe. Wenn die Kopie überschreiten würde, die Ziel-Puffer-Größe), dann ruft das Programmabort()
.Deaktivieren FORTIFY_SOURCE zum testen sollten Sie das Programm kompilieren mit
-U_FORTIFY_SOURCE
oder-D_FORTIFY_SOURCE=0
.InformationsquelleAutor der Antwort jww
In diesem Zusammenhang, ein Puffer ist ein Teil des Speichers beiseite für einen bestimmten Zweck, und ein buffer overflow ist das, was passiert, wenn ein Schreibvorgang in den Puffer zu gehen hält über das Ende (das schreiben in den Speicher, die hat einen anderen Zweck). Dies ist immer ein bug.
Einen buffer-overflow-Angriff ist eine, die verwendet diese Fehler, um etwas zu erreichen, der Autor hat nicht die Absicht, möglich.
InformationsquelleAutor der Antwort dmckee
Mit den richtigen Antworten gegeben, Um mehr zu diesem Thema, möchten Sie vielleicht zu hören die Podcast Security Now. In Episode 39 (eine Weile zurück), die Sie mit diesem Thema in die Tiefe. Dies ist ein schneller Weg, um ein tieferes Verständnis, ohne zu verdauen, ein ganzes Buch.
(Unter dem link finden Sie das Archiv mit mehreren size-Versionen sowie ein transcript, wenn Sie eher visuell orientiert). Audio ist nicht das perfekte medium für dieses Thema, aber Steve arbeitet Wunder für den Umgang mit diesem.
InformationsquelleAutor der Antwort Olaf Kock