Autor Thema: Formatstring  (Gelesen 8263 mal)

Lion

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« am: 05. February 2012, 10:27 »
Hallo zusammen,

Angesichts der Formatstringattacken wollte ich fragen, wer in sein OS eig. eine komplette Implementation von printf() in seinem OS drin hat...

http://de.wikipedia.org/wiki/Formatstring-Angriff

Das Beispiel in Wikipedia ist Ok, aber nicht das Beste, ja auch über %i usw, der Stack ausgelesen werden kann,
und z.B. Stack-Canaries (die vll. später mal im Betriebssystem folgen werden) erkannt und bei einem Stackoverflow-Angriff wieder eingeschleusst werden können.

Hat sich darüber hier schon mal jemand Gedanken gemacht?

Denn mal ehrlich, wer von euch hat noch nie einen über die Tastatur eingelesen String über
Zitat
printf(buffer);
ausgelesen, sonder benutzt immer
Zitat
printf("%s", buffer)
?

Mfg

Lion


PS: Ich habe das ganze (VisualBasic-ähnlich) über writeLine(char*) und writeDecimal(int) usw. implementiert...


kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 05. February 2012, 13:23 »
Also ich glaube nicht, dass ich in letzter Zeit solchen Code produziert habe... Du könntest aber gcc -Wformat=2 -Werror benutzen, um sicherzugehen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #2 am: 05. February 2012, 13:48 »
Denn mal ehrlich, wer von euch hat noch nie einen über die Tastatur eingelesen String über
Zitat
printf(buffer);
ausgelesen, sonder benutzt immer
Zitat
printf("%s", buffer)
?
ICH :)
Aber ich packe auch sehr gerne noch ein paar ANSI-Escape-Sequenzen drumherum damit es schön bunt wird :)

Und was die Implementierung im Kernel oder sonst wo angeht. Dort habe ich keine printf, oder ähnliche Funktion. Ich habe eine Hand voll log-funktionen die klar definierte Argumente erwarten.
(Die erhoffte Ordnung in den Log-files stellte sich dadurch allerdings nicht ein :) )

---
An Admin und Mod: Hatte gerade sehr komisches verhalten. War eingeloggt und wollte hier antworten. Als ich auf "Schreiben" klickte wurde ich aufgefordert mich einzuloggen, nachdem ich das Tat hieß es, dass ich nicht zwei Beiträge hintereinander schreiben dürfe.
Als ich dann unverrichteter Dinge zurück in den Thread ging war meine Antwort dort noch nicht gepostet. Ich hoffe es funktioniert jetzt :)

Dimension

  • Beiträge: 155
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 05. February 2012, 14:32 »
Also wenn ich mir hier einen kleinen Kommentar erlauben darf... Wenn ich irgendwann mal meine libc/API/Laufzeitumgebung schreiben werde, werde ich in den Funktions-Parametern von printf und Konsorten die format-Syntax durch eine Liste von Formatdefinitionen ersetzen. Hier kann man wenigstens Zugriffe exakt auflösen und ggf. im Source Zugriffsbeschränkungen für eingehende/nicht vertrauenswürdige Datenpfade einrichten. Abgesehen davon habe ich noch nie %n verwendet, wer kennt sinnvolle Anwendungen dafür?

Lion

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 05. February 2012, 15:13 »
Ich glaube, das war dazu da die bereits geschriebene ANzahl von Zeichen irgentwo abzuspeichern um evt. das geschriebene mit einer Anzahl von Leerzeichen aufzufüllen.

Die Benutzung zur Manipulation des Stacks ist recht umständlich...

Des weiteren kann ich ja mit %x mir den Stack ansehen, was wirklich nicht gut ist...

Dimension

  • Beiträge: 155
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 10. February 2012, 07:21 »
Ich glaube, das war dazu da die bereits geschriebene ANzahl von Zeichen irgentwo abzuspeichern um evt. das geschriebene mit einer Anzahl von Leerzeichen aufzufüllen.
Was spricht gegen strlen()? Also ich habe vor Jahren in CLI-Programmen auch Tabellen ausgegeben, aber %n habe ich dafür bisher noch nie verwendet. Und der erste Parameter von printf ist bei mir immer const.

Des weiteren kann ich ja mit %x mir den Stack ansehen, was wirklich nicht gut ist...
Geht aber auch nur im selben Prozess.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 10. February 2012, 19:55 »
Das %n stammt aus einer Zeit, als Speicher so unglaublich teuer war (und die Ausgabemedien primitive Nadeldrucker), dass man Tabellen möglichst ohne Zeitverzug und Puffer ausgeben wollte. Microsoft deaktiviert %n standardmäßig (man muss es explizit einschalten) und auch sonst ist es deprecated.

Gruß,
Svenska,
der darüber letztens einen Vortrag sah.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 10. February 2012, 22:04 »
Also ich habe noch kein Beispiel gesehen, wo %n irgendwie sinnvoll verwendet worden ist. Für Formatierung gibt es doch Feldbreite und Präzision?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Dimension

  • Beiträge: 155
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 10. February 2012, 22:53 »
Auch wenn einige auf die mauslose interaktion mit der Kommandozeile schwören, nehme ich lieber eine API  und einen typsicheren Script-Interpreter meiner Wahl, inklusive Autocompletion und Kontext-Dokumentation. Für Logfiles würde ich eh CSV bevorzugen. :-D

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 11. February 2012, 00:36 »
Sollte dieser Satz irgendeinen logischen inneren Zusammenhalt haben oder wolltest du einfach nur irgendwas schreiben?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen