Wegen des abnehmenden Interesses an Weihnachten werden einige Wichtel zu Programmierer*innen umgeschult. Aktuell steht C-Programmierung auf dem Plan und die Wichtel machen ihre ersten Schritte in dieser Programmiersprache.
Ein Wichtel hat ein C‑Programm kompiliert, sitzt jetzt heulend bei Santa im Büro und jammert darüber, dass das Programm „seltsame Dinge“ macht – es stürzt ab, sobald ein langer Name eingegeben wird.
„Zuhause hat es noch funktioniert“, behautet der Wichtel und vermutet einen Fehler im Compiler.
Santa lässt sich das Programm zeigen:
#include <stdio.h> #include <string.h> #include <stdlib.h> void store_name(char *name) { char buf[16];char *buf2 = malloc(-1); buf2[0] = 'a'; strcpy(buf, name); printf("Stored: %s\n", buf); } int main(int argc, char** argv) { char input[256]; fgets(input, sizeof(input), stdin); input[strcspn(input, "\n")] = '\0'; store_name(input); return 0; }
Erkläre, warum das Programm abstürzt. Was kann passieren? Wie könnte man den Code korrigieren?
Ursache: strcpy kopiert ohne Längenprüfung in den lokalen Puffer buf[16]. Wenn input länger als 15 Zeichen ist
(plus Nullterminator), wird der Puffer überlaufen und es tritt undefiniertes Verhalten auf (Stack-Smash). Ein
Angreifer könnte dies nutzen, um auf Rücksprungadressen/Daten zuzugreifen, die jeweils der Speichergrenze liegen.
Sichere Alternative (Beispiel):
void store_name(char *name) {
char buf[16];
strncpy(buf, name, sizeof(buf)-1);
buf[sizeof(buf)-1] = '\0';
printf("Stored: %s\n", buf);
}