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.

48 2 Programmieren <strong>mit</strong> <strong>Unix</strong>-Prozessen<br />

32 printf( "Ungültiger User.\n" );<br />

33 return( EXIT_FAILURE );<br />

34 }<br />

35<br />

36 printf( "Alles klar. User %s existiert.\n", argv[1] );<br />

37<br />

38 return( EXIT_SUCCESS );<br />

39 }<br />

36–39<br />

Wurde der Name vom System als gültiger Benutzer erkannt, so quittiert das<br />

Programm diesen Erfolg <strong>mit</strong> der Ausgabe "Alles klar. ..." <strong>und</strong> der Prozeß<br />

liefert den Statuscode für ein erfolgreiches Programmende an die aufrufende<br />

Umgebung zurück.<br />

Der Quelltext aus Beispiel 2.10 enthält, wie bereits angedeutet, gleich mehrere<br />

Schwachstellen: Was bei näherer Betrachtung schnell auffällt ist, daß im<br />

Hauptprogramm zu keinem Zeitpunkt eine Überprüfung der übergebenen Argumente<br />

stattfindet. Insbesondere wird nicht geprüft, wie lange die in argv[1]<br />

übergebene Zeichenkette ist. Die Länge könnte von einem Zeichen bis zu mehreren<br />

h<strong>und</strong>ert Zeichen variieren. Diese Zeichenkette wird dann ungeprüft an<br />

die Funktion user_exists() aus Beispiel 2.11 übergeben.<br />

Beispiel 2.11. overflow.c, Teil 2<br />

6 int user_exists( char *user )<br />

7 {<br />

8 int ok = 0;<br />

9 char buffer[8]; /* Achtung! */<br />

10<br />

11 printf( "Startadresse von ok: %x\n"<br />

12 "Startadresse von buffer: %x\n", &ok, buffer );<br />

13<br />

14 strcpy( buffer , user ); /* Achtung! */<br />

15<br />

16 if( getpwnam( buffer ) )<br />

17 ok = 1;<br />

18<br />

19 return( ok );<br />

20 }<br />

6–9<br />

In der Funktion user_exists() werden zunächst zwei lokale Variablen vereinbart.<br />

Die Variable ok soll den Rückgabewert der Funktion enthalten, sie wird<br />

standardmäßig <strong>mit</strong> Null, d. h. Mißerfolg“ initialisiert. Das Feld buffer[8]<br />

”<br />

dient zur übergangsweisen Aufbewahrung des an die Funktion übergebenen

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!