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 49<br />

11–14<br />

16–20<br />

Benutzernamens. 9 Der Längenangabe für das Feld liegt die Annahme zugr<strong>und</strong>e,<br />

daß ein <strong>Unix</strong>-Username nicht länger als acht Zeichen ist. Dies ist ein weiterer<br />

Mangel des Beispielprogramms, denn der Puffer enthält da<strong>mit</strong> nicht<br />

genügend Platz für einen Benutzernamen <strong>mit</strong> acht Zeichen <strong>und</strong> das für Zeichenketten<br />

obligatorische abschließende Null-Zeichen. Selbst wenn das Hauptprogramm<br />

also nur Usernamen <strong>mit</strong> maximal acht Zeichen Länge akzeptieren<br />

würde, wäre in der Puffervariable buffer nicht genügend Platz.<br />

Als erstes werden in der Funktion dann die Adressen der Variablen ok <strong>und</strong><br />

buffer ausgegeben. Dies dient lediglich dem besseren Verständnis der Problematik.<br />

Danach wird die übergebene Zeichenkette user <strong>mit</strong> der Funktion<br />

strcpy() in der Variable buffer zwischengespeichert. Beachten Sie, daß<br />

auch bei strcpy() keine Längenüberprüfung von Quelle oder Ziel stattfindet.<br />

Es wird also versucht, einen prinzipiell beliebig langen Text in einem Zwischenspeicher<br />

von acht Zeichen Länge unterzubringen. Im Bedarfsfall, falls<br />

also der Inhalt von user länger als acht Zeichen (inklusive terminierendes<br />

Null-Zeichen) ist, wird rücksichtslos über das Ende von buffer hinaus weiter<br />

geschrieben, der Buffer-Overflow nimmt seinen Lauf.<br />

Anschließend wird über die Funktion getpwnam() versucht, den in den Zwischenspeicher<br />

kopierten Usernamen in der Benutzerdatenbank des Systems<br />

ausfindig zu machen. Liefert getpwnam() einen Null-Zeiger zurück, konnte<br />

der angegebene Benutzer nicht gef<strong>und</strong>en werden, ok bleibt unverändert. Andernfalls<br />

wird die Variable ok auf 1 gesetzt, die Operation war erfolgreich.<br />

Schließlich wird der Inhalt von ok an das Hauptprogramm zurück gegeben.<br />

Nachdem wir die prinzipielle Natur eines Buffer-Overflows verstanden haben,<br />

wollen wir uns <strong>mit</strong> einigen Testläufen die konkreten Auswirkungen für das<br />

Testprogramm aus Beispiel 2.10 <strong>und</strong> 2.11 ansehen. Zunächst starten wir das<br />

Programm <strong>mit</strong> einem existierenden Benutzer <strong>mit</strong> kurzem Usernamen als erstes<br />

Argument:<br />

$ ./overflow zahn<br />

Startadresse von ok: 2ff22708<br />

Startadresse von buffer: 2ff22700<br />

Alles klar. User zahn existiert.<br />

Das Ergebnis entspricht genau unseren Erwartungen. Der angegebene Username<br />

ist dem System bekannt. Die Startadresse von buffer ist kleiner als die<br />

Startadresse von ok. 10 Die vier Zeichen des Benutzernamens finden samt Null-<br />

Zeichen zum Abschluß der Zeichenkette spielend in der acht Zeichen großen<br />

Puffer-Variable buffer Platz.<br />

9 Es ist natürlich offensichtlich, daß diese Variable in diesem konstruierten Beispiel<br />

lediglich zu Demonstrationszwecken benötigt wird.<br />

10 Sollte dies bei Ihrem Testlauf gerade anders herum sein, so vertauschen Sie für<br />

die weiteren Tests bitte die beiden Variablenvereinbarungen von buffer <strong>und</strong> ok<br />

<strong>mit</strong>einander <strong>und</strong> übersetzen das Programm danach neu. Jetzt sollte auch bei<br />

Ihnen die Startadresse von buffer kleiner sein als die von ok.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!