05.11.2013 Aufrufe

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

2.3 Buffer-Overflows <strong>und</strong> Format-String-Schwachstellen 51<br />

StackSegment<br />

Rücksprungadresse<br />

StackBasiszeiger<br />

int ok;<br />

char buffer[8];<br />

(4 Bytes)<br />

(8 Bytes)<br />

HeapSegment (dynamische Bereiche)<br />

BSS/DataSegment (globale Variablen)<br />

TextSegment (Programmcode)<br />

Abb. 2.7. Speicherbelegung von Beispiel 2.11<br />

besseren Verständnis nochmals Abb. 2.3. Die Abbildung zeigt die typische<br />

Speicherbelegung von Prozessen: Das Text-Segment enthält den Maschinencode<br />

des Programms, Data- <strong>und</strong> BSS-Segment beherbergen die globalen Variablen,<br />

im Heap-Segment liegen die dynamisch allozierten Speicherblöcke <strong>und</strong><br />

im von oben nach unten wachsenden Stack-Segment werden Registerwerte<br />

zwischengespeichert <strong>und</strong> sowohl Funktionsargumente als auch lokale Variablen<br />

abgelegt. Außerdem wird vor dem Aufruf eines Unterprogramms dort<br />

die Rücksprungadresse hinterlegt. Abbildung 2.7 zeigt, wie der Stack beim<br />

Aufruf von user_exists() aus Beispiel 2.11 in etwa aussehen könnte.<br />

Durch Kenntnis eines möglichen Buffer-Overflows kann jetzt versucht werden,<br />

mehr als nur den Inhalt der Variable ok zu überschreiben. Viel interessanter ist<br />

für Angreifer meist die gezielte Manipulation der Rücksprungadresse <strong>und</strong> das<br />

Einbringen eigenen Maschinencodes in das vorhandene Programm. Durch eine<br />

entsprechend lange Eingabe überschreibt man zunächst die lokalen Variablen<br />

der Funktion, setzt den Stack-Basiszeiger <strong>und</strong> die Rücksprungadresse auf den<br />

Anfang des eigenen Maschinencodes, den man im Rest der Eingabe gleich<br />

<strong>mit</strong>liefert. Abbildung 2.8 veranschaulicht das prinzipielle Vorgehen bei einem<br />

Exploit, d. h. beim Ausnutzen einer solchen Sicherheitslücke.<br />

Der auf diese Weise eingebrachte eigene Maschinencode wird nun bei der<br />

späteren Rückkehr aus der Funktion anstelle der ursprünglich hinterlegten<br />

Rücksprungadresse angesprungen <strong>und</strong> ausgeführt. Der Stackzeiger verweist<br />

auf den Speicherbereich unterhalb der eigenen Maschinenbefehle, der Stack<br />

kann da<strong>mit</strong> uneingeschränkt von den neuen Befehlen verwendet werden. Oftmals<br />

beschränkt sich der illegal eingebrachte Programmcode auf das Öffnen<br />

einer neuen Shell, über die dann <strong>mit</strong> den Privilegien des angegriffenen Ser-

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!