Frage zu formatstring attack



  • Hi,

    Ich lese mich gerade in das Thema format string attacks ein und denke ich hab's insgesammt auch schon halbwegs verstanden.
    Was ich absolut nicht raffe ist warum dieser Code nicht angreifbar ist:

    printf ("%s", userName);
    

    aber dieser Schon:

    printf ("Dein Name ist %s", userName);
    

    Es geht doch darum das im oberen Beispiel der Funktion mitgeteilt wird das userName als str zu behandeln ist. Das ist doch aber bei der unteren Funktion genauso der Fall 😕 . Hat es irgendetwas damit zu tun das ein "normaler" String mit format chars gemischt wird ?

    Ich bin natürlich schon in google unterwegs, aber werde da nicht fündig.

    Wäre sehr dankbar für eine Erklärung 🙂




  • Mod

    Die sind beide nicht angreifbar. Wo hast du das her?



  • cler schrieb:

    Das sollte doch klar sein:
    https://www.owasp.org/index.php/Format_string_attack

    Genau den Artikel hab ich schon mehrmals gelesen, es ist mir aber trotzdem nicht klar...vlt. bin ich begriffstützig.

    Meinem Verständnis nach sollte "Bob %x %x" als String behandelt werden, weil es in printf ja braf mit %s "referenziert" wird. Anscheinend werden die beiden %x aber trotzdem als format chars behandelt.

    SeppJ schrieb:

    Die sind beide nicht angreifbar. Wo hast du das her?

    Das Beispiel, das auch cler gepostet hat, hat mich zu dieser Annahme gebracht.
    Immerhin ist dort

    printf ( “Buffer size is: (%d) \nData input: %s \n” , strlen (buf) , buf ) ;
    

    angreifbar.
    Ich dachte ich vereinfache das Beispiel einwenig 🙂



  • Vermutlich wenn man username als Inout von der Konsole ungeprüft übernimmt.
    Wenn dann Jemand Bob %x%x%x%x%x%x, kann man etwas aus der Ausgabe herleiten


  • Mod

    Die verwundbare Zeile ist in dem Beispiel ganz woanders:

    snprintf ( buf, sizeof buf, argv [1] ) ;
    

    Hier findet der Angriff statt. Der Userinput argv[1] wird als Formatstring übernommen. Da darin auch Formattokens stehen können, kann der Nutzer durch geschickte Wahl des Inputs wer weiß was auslösen.

    Die ganze Seite schein mir nicht so gut zu sein. Der ganze Code ist voller Fehler und die Erklärung ist selbst mir, der die Attacke schon kennt, äußerst unklar.



  • SeppJ schrieb:

    Die verwundbare Zeile ist in dem Beispiel ganz woanders:

    snprintf ( buf, sizeof buf, argv [1] ) ;
    

    Hier findet der Angriff statt. Der Userinput argv[1] wird als Formatstring übernommen. Da darin auch Formattokens stehen können, kann der Nutzer durch geschickte Wahl des Inputs wer weiß was auslösen.

    Die ganze Seite schein mir nicht so gut zu sein. Der ganze Code ist voller Fehler und die Erklärung ist selbst mir, der die Attacke schon kennt, äußerst unklar.

    Ah...das machts schon einwenig klarer 🙂

    Danke!



  • Eien etwas ausführlichere Beschreibung gibts auch hier:
    http://www.cis.syr.edu/~wedu/Teaching/cis643/LectureNotes_New/Format_String.pdf

    Ist sogar fehlerfreier und einfacher erklärt.


  • Mod

    #include  <stdio.h>
    
    int main ()
    {
      char string[]="Dies ist eine Zeichenkette %d";
      puts("So gibt man Zeichenketten mit printf&Co. richtig aus:");
      printf("%s\n", string);
      puts("Und so passiert wer weiß was, da eventuelle Formattoken in der Zeichenkette mit verarbeitet werden:");
      printf(string);
      return 0;
    }
    

    Mögliches Beispielgeschehen: http://ideone.com/HQGa9x

    Nun klar? Daher sollte der Formatstring niemals aus (ungeprüftem) Userinput erzeugt werden.



  • Ich denke jetzt hab ichs.

    Danke für eure Antworten.


Anmelden zum Antworten