Ich erwähnte "Pufferüberläufe" in einem Kommentar zu Pythagras 'Antwort. Ich sollte wahrscheinlich klarstellen, was ich ein bisschen meinte. In C reicht es nicht aus zu wissen, dass die direkte Arbeit mit dem Speicher gefährlich ist - Sie sollten auch genau verstehen, wie gefährlich dies ist. Ich mag die Metapher "Sich in den Fuß schießen" für all diese Fälle nicht wirklich - oft ist es nicht so, dass Sie den Abzug betätigen, aber oft ist es ein Schauspieler mit Interessen, die Ihren und / oder den Ihrer Benutzer widersprechen .
Wenn Sie beispielsweise in einer Architektur mit absteigendem Stapel (die gängigsten Architekturen passen zu dieser Rechnung - x86 und ARM im Allgemeinen enthalten), wenn Sie eine Funktion aufrufen, wird die Rücksprungadresse für die Funktion nach den in der Liste definierten lokalen Variablen auf dem Stapel abgelegt Körper der Funktion. Wenn Sie also einen Puffer als lokale Variable deklarieren und diese Variable der Außenwelt aussetzen, ohne auf Pufferüberlauf zu prüfen, gehen Sie wie folgt vor:
void myFn(void) {
char buf[256];
gets(buf);
}
Ein externer Benutzer kann Ihnen eine Zeichenfolge senden, die die Rücksprungadresse vom Stapel überschreibt. Grundsätzlich kann er die Laufzeitidee Ihres Programms für das Aufrufdiagramm ändern, das zur aktuellen Funktion führt. Der Benutzer gibt Ihnen also eine Zeichenfolge, die die binäre Darstellung eines ausführbaren Codes für Ihre Architektur darstellt, genügend Auffüllungen, um den Stapel zu überlaufen myFn
, und einige zusätzliche Daten, um die Rücksprungadresse zu überschreiben myFn
, um auf den Code zu verweisen, den er Ihnen gegeben hat. Wenn dies passiert, myFn
verzweigt es normalerweise zu Code, den der böswillige Benutzer bereitgestellt hat , wenn er normalerweise die Kontrolle an seinen Anrufer zurückgegeben hätte. Wenn Sie C- (oder C ++) Code schreiben, der möglicherweise nicht vertrauenswürdigen Benutzern ausgesetzt ist, müssen Sie diesen Angriffsvektor verstehen. Sie sollten verstehen, warum ein Pufferüberlauf gegen den Stapel oft (aber nicht immer) leichter ausgenutzt werden kann als einer gegen den Heap, und Sie sollten verstehen, wie der Speicher im Heap aufgebaut ist (nicht unbedingt zu detailliert, aber der Die Vorstellung, dass eine malloc()
Region von Kontrollstrukturen umgeben ist, kann helfen, zu verstehen, warum Ihr Programm in einer anderen malloc()
oder in einer anderen abstürzt free()
.
C macht Sie mit einfachen Details über die Funktionsweise Ihres Computers vertraut und bietet Ihnen eine direktere Kontrolle über Ihren Computer als jede andere vom Benutzer bearbeitete Sprache, die heute weit verbreitet ist. Mit großer Leistung geht eine große Verantwortung einher - Sie müssen diese Details auf niedriger Ebene verstehen, um sicher und effektiv mit C arbeiten zu können.