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.


Log in to reply