Ich bin etwas verwirrt in der Idee der Code-Injektion in C. Wenn jemand es erklären und zeigen könnte, wie es gemacht wird, würde ich es schätzen.
Also sagen wir in C, Sie haben ein Char-Array der Größe 512, das in den Inhalt eines Sockets der Länge 1024 geschrieben wird, und dieses char-Array enthält nun eine Art Code, aber nur die Hälfte von dem, was geschrieben wurde.
Wie wird der bösartige Code in einem Pufferüberlauf ausgeführt? Ich glaube, ich bin in der Prozessstruktur (Stack, Heap, Daten, Text) verwirrt.
Der allgemeine Trick hat damit zu tun, wie der Programmcode und die Variablen im Speicher abgelegt sind. Wenn zum Beispiel eine Funktion aufgerufen wird, muss das Programm (Code, der vom Compiler eingefügt wurde) die Adresse der Anweisung speichern, zu der es zurückkehren soll. Wenn dies also das 32-Bit-Wort kurz vor dem Beginn des Stapels ist, könnte man folgendes tun:
%Vor%(Ihr Job besteht also darin, Code zu erstellen, damit so etwas nicht möglich ist. :))
Die Regeln für die Implementierung eines Funktionsaufrufs, zugewiesene Stapelvariablen, übergebene Werte und zurückgegebene Rückgabewerte werden als Aufruf Konvention . Ich empfehle den beigefügten Artikel für eine gute eingehende Berichterstattung über C-Calling-Konvention.
Wenn Sie auf dem Stapel einen Puffer reservieren und dieser überläuft, schreibt er auf den Stapel. Der Stapel enthält den Rückgabezeiger für die Funktion, die den Puffer zugewiesen hat. Wenn Sie also einen Puffer auf dem Stack überlaufen lassen, können Sie den Rückgabezeiger auf einen beliebigen Wert setzen. Dadurch haben Sie die Kontrolle über den Thread der Ausführung.
Um den Code tatsächlich zu injizieren, kommt es darauf an. Der Stapel - oder vielmehr die Seite, die ihn enthält - ist oft so eingestellt, dass keine Codeausführung möglich ist. aber historisch wäre es möglich gewesen, kleine schädliche Programme in dem Puffer selbst auf dem Stapel zu speichern. Return-orientierte Programmierung ist eine ziemlich neue Variante der return-to-libc Angriff, die beide umgehen NX-Bits.
Ein typischer Stapel für jedes Unterprogramm könnte so aussehen:
Wenn ein Unterprogramm eine lokale Variable hat und irgendwie über das Ende der lokalen Variablen hinaus schreibt, dann überschreibt es Werte (auf dem Stapel) wie die Rücksprungadresse, dh die Adresse des Codes, der am Ende von ausgeführt wird das Unterprogramm, wenn das Unterprogramm eine "Rückkehr" ausführt.
Tags und Links c