Lecture 7: Eingabe Flashcards
(29 cards)
Was ist ein Buffer Overflow?
Ein Lese‑ oder Schreibzugriff, der über die reservierten Grenzen eines Puffers (Arrays) hinausgeht.
Nenne ein konkretes Angriffsszenario, das ein Buffer Overflow ermöglicht.
Durch Überschreiben der Rücksprungadresse im Stack kann der Angreifer den Kontrollfluss zu beliebigem Code umlenken.
Warum kann bereits ein 1‑Byte‑Overflow kritisch sein?
Selbst ein einzelnes überschriebenes Byte kann Metadaten (z. B. Längenfelder, Flags, Funktionspointer) verändern und so Sicherheitsmechanismen umgehen.
Welche typische Fehlermeldung weist auf einen illegalen Speicherzugriff hin?
Segmentation Fault (Verletzung des Speicherschutzes).
Zwei häufige Ursachen eines Segmentation Faults?
Schreibzugriff auf read‑only‑Bereiche (z. B. Konstanten).
Dereferenzierung eines Null‑Pointers.
Was ist ein Off‑By‑One‑Fehler?
Ein Über‑ oder Unterschreiten der Array‑Grenze um genau ein Element, z. B. weil das Null‑Byte nicht mitgerechnet wird.
Warum ist gets() gefährlich und seit C11 aus dem Standard entfernt?
Es liest unbegrenzt Daten bis ’\n’ oder EOF – ohne Längenprüfung – und provoziert so leicht Buffer Overflows.
Sichere Alternative zu gets()?
fgets(dest, n, stream) – liest maximal n‑1 Zeichen und nullterminiert den String.
Was ist das Problem bei strcpy(dest, src)?
Kopiert, ohne zu prüfen, ob src länger als dest ist.
Welche Funktion kann strcpy entschärfen, und welche Falle gibt es trotzdem?
strncpy(dest, src, n) – aber nur nullterminiert, wenn innerhalb der ersten n Bytes ein ’\0’ in src vorkommt.
Warum ist strcat riskant?
Es hängt src an dest an, ohne zu kontrollieren, ob dest genug Platz hat (Summe der Längen +1 ≤ Buffergröße).
Sichere Variante zu strcat?
strncat(dest, src, n) – trotzdem muss gelten: strlen(dest) + n < size(dest).
Welcher klassische Fehler entsteht durch scanf(“%40s”, buf), wenn buf exakt 40 Bytes groß ist?
Off‑By‑One‑Overflow, weil scanf bis zu 40 Zeichen plus Null‑Byte schreibt.
Was versteht man unter Format‑String‑Injection?
Wenn ein Benutzerformatstring direkt an printf übergeben wird (z. B. printf(buf)) und Platzhalter wie %x, %n Register/Stack auslesen oder überschreiben.
Wie verhindert man Format‑String‑Fehler?
Immer einen konstanten Formatstring verwenden, z. B. printf(“Hello %s!\n”, buf);
Was ist ein Memory Leak?
Heap‑Speicher, der nach Gebrauch nicht freigegeben wird und dadurch dauerhaft verloren ist.
Wann sind Memory‑Leaks besonders kritisch?
In lang laufenden Programmen (Server, Daemons), weil sie zu stetig wachsendem Speicherbrauch führen.
Use‑After‑Free vs. Double Free – was ist der Unterschied?
Use‑After‑Free: Ein Pointer wird nach free() weiterbenutzt.
Double Free: Derselbe Speicherblock wird zwei‑mal an free() übergeben.
Welche Kategorie von Fehlern beschreibt der Begriff Undefined Behavior in C?
Programmzustände, die laut Sprachstandard nicht definiert sind und somit beliebige Effekte haben dürfen.
Drei Beispiele für Undefined Behavior?
Null‑Pointer‑Dereferenzierung, signed Integer‑Overflow, Verschieben (shift) um mehr Bits als das Integer breit ist.
Welche drei Compiler‑Sanitizer können typische Speicherfehler entdecken?
-fsanitize=address (Overflows, Dangling Pointers)
-fsanitize=leak (Memory Leaks)
-fsanitize=undefined (Undefined Behavior)
Hauptnachteile beim Kompilieren mit Sanitizern?
Langsamere Programmausführung und teilweise erschwertes Debugging, außerdem nicht alle Fehler abgedeckt.
Warum sollte man den Rückgabewert von malloc prüfen?
Bei Speicherknappheit liefert malloc NULL; eine ungeprüfte Dereferenzierung führt zu Undefined Behavior oder Segmentation Fault.
In welchem Fall ist ein ausgelassener free() weniger dramatisch?
Unmittelbar vor Programmende – aber selbst dann ist sauberes Aufräumen gute Praxis (Testbarkeit, Wiederverwendung von Code).