(c) teso. all rights reversed.
exploiting format string vulnerabilities - Stack Popping

Stack Popping

Ein Problem kann auftreten, wenn die Länge des usersupplied Teils des Format Strings nicht ausreicht um sich mit "%u" hochzuarbeiten. Ausserdem erzeugt "%u" nicht einfach vorhersagbare Längen der Ausgabe. Es gibt bessere Methoden sich auf dem Stack hochzuarbeiten, die jedoch zwecks Vereinfachung noch nicht erwähnt wurden.

Mit dem "%f" Parameter, der zur Ausgabe von float Zahlen gedacht ist, können 8 Bytes auf einmal vom Stack geholt werden. Dies hat jedoch den Nachteil, dass wenn "Müll" vom Stack als float-Zahl ausgegeben wird, es zu Abstürzen kommen kann, da unzulässige Operationen (div zero) nicht gehandelt werden.
Mit "%.f" gibt man nur den Vorkommateil einer float-Zahl aus, was zu keinen Komplikationen führt. So kann man mit 3 Byte Aufwand 8 Bytes vom Stack holen (8 by 3).

Unter *BSD (und Irix :-), ist es möglich den '*'-qualifier für unsere Zwecke einzusetzen. Während "%10d" den Parameter mit 10 Stellen ausgibt, kann mit Hilfe von "%*d" dynamisch angegeben werden, mit wieviel Stellen die Zahl ausgegeben werden soll: Der nächste Parameter auf dem Stack gibt die Länge der Ausgabe an. Da die LibC Parameter der Art "%********d" erlaubt, nähert man sich einem "4 by 1" Verhältnis an: Mit einem Byte Aufwand kann man vier Bytes vom Stack holen.
Da jedoch die Ausgabelänge wieder unbestimmt ist, nämlich dem Wert des letzten Parameters entspricht, ist es noch nicht optimal. Hier kann man die '*'-Spezifikation überschreiben: "%********10d", gibt die Zahl trotzdem nur mit genau 10 Stellen aus, obwohl die Länge vorher mehrere Male dynamisch gesetzt wurde. Diese Tricks wurden zuerst von lorian gefunden.

<< - < - > - >>