2025 - Adventskalender der Fakultät für Informatik
Icon für Tag 11

Tag 11: Absturz

Warnschild: Achtung Absturzgefahr

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?

Auflösung: Spoiler Alarm

Auflösung

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);
}

Fakultät für Informatik | Technische Hochschule Mannheim | Impressum und Datenschutzerklärung