Overflow minimal: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| Zeile 49: | Zeile 49: | ||
== Analyse mit GDB == | == Analyse mit GDB == | ||
| − | + | Beispiel: | |
| − | + | *gdb --args ./overflow_minimal "$(python3 -c 'print(\"A\"*200)')" | |
# in gdb: run | # in gdb: run | ||
# nach Crash: bt | # nach Crash: bt | ||
# nützliche Befehle: bt, info registers, x/32x $rsp, disas | # nützliche Befehle: bt, info registers, x/32x $rsp, disas | ||
| − | |||
== Sicherer Fix (Kontrast) == | == Sicherer Fix (Kontrast) == | ||
Version vom 3. November 2025, 20:06 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)
- cat 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
- echo $?
0
Kurze Überschreitung (7 Zeichen):
- ./overflow_minimal ABCDEFG
Du hast eingegeben: ABCDEFG Segmentation fault
- echo $?
139
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
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.