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

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

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

8<br />

9<br />

Die Verwendung der fgets()-Funktion schützt das Programm vor eventuellen<br />

Buffer-Overflows, die durch ein Überschreiten der Puffergrenzen der Variable<br />

buffer entstehen könnten. fgets() liest maximal n-1 (hier also 255) Zeichen<br />

aus dem Datenstrom stdin in das Feld buffer <strong>und</strong> terminiert die gelesene<br />

Zeichenkette <strong>mit</strong> einem Null-Zeichen.<br />

Auch <strong>mit</strong> der Ausgabe der eben gelesenen Zeichenfolge ist in diesem Beispiel<br />

alles in Ordnung, was die folgenden Tests belegen:<br />

$ echo "Irgendwann muß jeder einmal heim." | ./cat1<br />

Irgendwann muß jeder einmal heim.<br />

$ echo "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s" | ./cat1<br />

%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s<br />

Als tippfauler“ Programmierer könnte man nun versucht sein, den Tippaufwand<br />

weiter zu verringern. Wäre es nicht viel eleganter, anstatt der Forma-<br />

”<br />

tangabe "%s" – eine Zeichenkette, die anzeigt, daß der nachfolgende Funktionsparameter<br />

als Zeichenkette ausgegeben werden soll – gleich die eigentliche<br />

Zeichenkette an printf() zu übergeben?<br />

Beispiel 2.13 zeigt die im Vergleich zu Beispiel 2.12 geringfügig verkürzte<br />

Variante des gleichen Programms, die jedoch fatale Nebenwirkungen auf das<br />

Verhalten des Programms haben kann.<br />

1 #include <br />

2 #include <br />

Beispiel 2.13. cat2.c<br />

3<br />

4 int main( int argc, char *argv[] )<br />

5 {<br />

6 char buffer[256];<br />

7<br />

8 while( fgets( buffer , 256, stdin ) )<br />

9 printf( buffer ); /* Achtung! */<br />

10<br />

11 return( EXIT_SUCCESS );<br />

12 }<br />

Wir testen die zweite Variante des Programms <strong>mit</strong> den gleichen Eingaben<br />

wie zuvor. Die erste Ausgabe entspricht exakt der Ausgabe aus dem ersten<br />

Beispiel, alles scheint zu klappen. Doch der zweite Aufruf des Programms<br />

führt zu einem kompletten Absturz des Beispielprogramms:<br />

$ echo "Irgendwann muß jeder einmal heim." | ./cat2<br />

Irgendwann muß jeder einmal heim.<br />

$ echo "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s" | ./cat2<br />

Segmentation fault (coredump)

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!