Overflow minimal: Unterschied zwischen den Versionen

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen
Zeile 1: Zeile 1:
 
= Buffer Overflow: Die unsichtbare Gefahr in 6 Bytes =
 
= Buffer Overflow: Die unsichtbare Gefahr in 6 Bytes =
*Kurzbeschreibung
+
==Kurzbeschreibung==
* :Ein winziger Programmierfehler kann verheerende Folgen haben. Das Beispielprogramm '''overflow_minimal.c''' zeigt, wie bereits 6 Bytes ausreichen, um eine kritische Schwachstelle zu erzeugen.
+
*Dieses Lehrbeispiel zeigt, wie ein unsicherer Kopiervorgang in C bei einem 6-Byte-Puffer zu einem Stack-Buffer-Overflow und damit zu einem Absturz führen kann. Nur Analyse/Lehre in einer isolierten VM. Kein Exploit.
* :Zweck: Lehrbeispiel für Trainings und Code-Reviews. Nur in einer isolierten Labor-VM ausführen.
 
  
*Voraussetzungen
+
=Voraussetzungen=
* :Debian/Ubuntu oder andere Linux-Distribution mit gcc, gdb und python3 installiert.
+
* Debian/Ubuntu oder eine ähnliche Linux-Distribution mit gcc, gdb und python3.
 
 
== Das gefährliche Programm ==
 
* :Datei: overflow_minimal.c
 
* :Hinweis: Der Code ist absichtlich unsicher, um den Überlauf sichtbar zu machen. Nur zu Lehrzwecken in eigenen Laboren verwenden.
 
  
 +
== Beispielcode (kopierbar) ==
 +
* Datei: overflow_minimal.c
 
   /* overflow_minimal.c - Buffer Overflow Demonstration */
 
   /* overflow_minimal.c - Buffer Overflow Demonstration */
 
   #include <stdio.h>
 
   #include <stdio.h>
Zeile 17: Zeile 14:
 
   void func(char *input)
 
   void func(char *input)
 
   {
 
   {
       char buffer[6];  // Nur 6 Bytes Puffer!
+
       char buffer[6];  // Nur 6 Bytes Puffer (einschließlich NUL)
       strcpy(buffer, input);  // Keine Längenprüfung!
+
       strcpy(buffer, input);  // Absichtlich unsicher: keine Längenprüfung
 
       printf("Du hast eingegeben: %s\n", buffer);
 
       printf("Du hast eingegeben: %s\n", buffer);
 
   }
 
   }
Zeile 33: Zeile 30:
  
 
== Kompilieren ==
 
== Kompilieren ==
* :Stack-Protector deaktiviert, Debug-Symbole aktiv:
+
* Stack-Protector deaktiviert, Debug-Symbole aktiv:
 
   gcc -fno-stack-protector -z execstack -g -o overflow_minimal overflow_minimal.c
 
   gcc -fno-stack-protector -z execstack -g -o overflow_minimal overflow_minimal.c
* :Analyse mit AddressSanitizer:
+
* Analyse mit AddressSanitizer:
 
   gcc -g -fsanitize=address -fno-omit-frame-pointer -o overflow_minimal_asan overflow_minimal.c
 
   gcc -g -fsanitize=address -fno-omit-frame-pointer -o overflow_minimal_asan overflow_minimal.c
  
 
== Testen ==
 
== Testen ==
* :Normale Eingabe (≤ 6 Zeichen):
+
* Normale Eingabe (≤ 6 Zeichen):
 
   ./overflow_minimal ABCDEF
 
   ./overflow_minimal ABCDEF
 
   # Ausgabe: Du hast eingegeben: ABCDEF
 
   # Ausgabe: Du hast eingegeben: ABCDEF
* :Kurze Überschreitung (7 Zeichen):
+
* Kurze Überschreitung (7 Zeichen):
 
   ./overflow_minimal ABCDEFG
 
   ./overflow_minimal ABCDEFG
* :Zuverlässiger Crash (lange Eingabe):
+
* Zuverlässiger Crash (lange Eingabe):
 
   ./overflow_minimal "$(python3 -c 'print(\"A\"*200)')"
 
   ./overflow_minimal "$(python3 -c 'print(\"A\"*200)')"
  
 
== Beobachtbares Verhalten ==
 
== Beobachtbares Verhalten ==
* :Kurze Überläufe treffen oft nur lokale Variablen; das Programm kann noch Ausgaben machen und später abstürzen.
+
* Kurze Überläufe überschreiben zunächst nur lokale Daten; der Absturz kann verzögert auftreten.
* :Lange Eingaben überschreiben saved registers / return address und führen meist zu SIGSEGV.
+
* Lange Eingaben überschreiben meist die Rücksprungadresse und führen zu SIGSEGV.
* :Mit ASAN-Kompilation erhältst du eine klare Meldung („stack-buffer-overflow“) mit Backtrace.
+
* Mit ASAN-Kompilation erhältst du eine klare Meldung („stack-buffer-overflow“) mit Backtrace.
  
 
== Analyse mit GDB ==
 
== Analyse mit GDB ==
* :Beispiel:
+
* Beispiel:
 
   gdb --args ./overflow_minimal "$(python3 -c 'print(\"A\"*200)')"
 
   gdb --args ./overflow_minimal "$(python3 -c 'print(\"A\"*200)')"
 
   # in gdb: run
 
   # in gdb: run
 
   # nach Crash: bt
 
   # nach Crash: bt
   # ggf.: info registers, x/24x $rsp, disas
+
   # nützliche Befehle: bt, info registers, x/32x $rsp, disas
* :Trainer-Hinweis: Stack-Layout (saved RBP, return address, lokale Variablen) erklären.
+
* Trainer-Hinweis: Stack-Layout (saved RBP, return address, lokale Variablen) erläutern.
  
 
== Sicherer Fix (Kontrast) ==
 
== Sicherer Fix (Kontrast) ==
Zeile 69: Zeile 66:
  
 
== Fazit ==
 
== Fazit ==
* :Schon minimale Programmierfehler können massive Sicherheits- oder Stabilitätsprobleme verursachen.
+
* Schon minimale Programmierfehler können massive Sicherheits- oder Stabilitätsprobleme verursachen.
* :Sorgfalt bei Puffergrößen, Eingabevalidierung und das Nutzen moderner Schutzmechanismen sind Pflicht in der sicheren Softwareentwicklung.
+
* Sorgfalt bei Puffergrößen, Eingabevalidierung und das Nutzen moderner Schutzmechanismen sind Pflicht in der sicheren Softwareentwicklung.

Version vom 3. November 2025, 20:01 Uhr

Buffer Overflow: Die unsichtbare Gefahr in 6 Bytes

Kurzbeschreibung

  • Dieses Lehrbeispiel zeigt, wie ein unsicherer Kopiervorgang in C bei einem 6-Byte-Puffer zu einem Stack-Buffer-Overflow und damit zu einem Absturz führen kann. Nur Analyse/Lehre in einer isolierten VM. Kein Exploit.

Voraussetzungen

  • Debian/Ubuntu oder eine ähnliche Linux-Distribution mit gcc, gdb und python3.

Beispielcode (kopierbar)

  • Datei: overflow_minimal.c
 /* overflow_minimal.c - Buffer Overflow Demonstration */
 #include <stdio.h>
 #include <string.h>
 void func(char *input)
 {
     char buffer[6];   // Nur 6 Bytes Puffer (einschließlich NUL)
     strcpy(buffer, input);  // Absichtlich unsicher: keine Längenprüfung
     printf("Du hast eingegeben: %s\n", buffer);
 }
 int main(int argc, char *argv[])
 {
     if (argc < 2) {
         printf("Usage: %s <input>\n", argv[0]);
         return 1;
     }
     func(argv[1]);
     return 0;
 }

Kompilieren

  • Stack-Protector deaktiviert, Debug-Symbole aktiv:
 gcc -fno-stack-protector -z execstack -g -o overflow_minimal overflow_minimal.c
  • Analyse mit AddressSanitizer:
 gcc -g -fsanitize=address -fno-omit-frame-pointer -o overflow_minimal_asan overflow_minimal.c

Testen

  • Normale Eingabe (≤ 6 Zeichen):
 ./overflow_minimal ABCDEF
 # Ausgabe: Du hast eingegeben: ABCDEF
  • Kurze Überschreitung (7 Zeichen):
 ./overflow_minimal ABCDEFG
  • Zuverlässiger Crash (lange Eingabe):
 ./overflow_minimal "$(python3 -c 'print(\"A\"*200)')"

Beobachtbares Verhalten

  • Kurze Überläufe überschreiben zunächst nur lokale Daten; der Absturz kann verzögert auftreten.
  • Lange Eingaben überschreiben meist die Rücksprungadresse und führen zu SIGSEGV.
  • Mit ASAN-Kompilation erhältst du eine klare Meldung („stack-buffer-overflow“) mit Backtrace.

Analyse mit GDB

  • Beispiel:
 gdb --args ./overflow_minimal "$(python3 -c 'print(\"A\"*200)')"
 # in gdb: run
 # nach Crash: bt
 # nützliche Befehle: bt, info registers, x/32x $rsp, disas
  • Trainer-Hinweis: Stack-Layout (saved RBP, return address, lokale Variablen) erläutern.

Sicherer Fix (Kontrast)

 void func_safe(char *input)
 {
     char buffer[6];
     snprintf(buffer, sizeof buffer, "%s", input);
     printf("Du hast eingegeben: %s\n", buffer);
 }

Fazit

  • Schon minimale Programmierfehler können massive Sicherheits- oder Stabilitätsprobleme verursachen.
  • Sorgfalt bei Puffergrößen, Eingabevalidierung und das Nutzen moderner Schutzmechanismen sind Pflicht in der sicheren Softwareentwicklung.