(c) teso. all rights reversed.
exploiting format string vulnerabilities - "Ich will nur gucken"

"Ich will nur gucken"

Mit Hilfe von Format String vulnerabilities kann man - falls man den geprintf'ten Format String sehen kann - beliebige Speicheradressen auslesen.

Zunächst das Auslesen des Stackes:

"%08x.%08x.%08x.%08x.%08x", zeigt die ersten fünf Parameter, die auf den Format-String-Pointer im Stack folgen, an. So kann man, je nachdem, wie lang der Zielbuffer und wie lang der Format String sein kann, den Stack mehr oder weniger komplett anzeigen und somit rekonstruieren.

Auslesen beliebiger Speicheradressen:

Um beliebigen Speicher anzuzeigen muss man die Format-Funktion dazu bringen, als aktuellen Parameter eine von uns gegebene Adresse zu benutzen. Wenn dass der Fall ist, kann man mit "%s" den String bei dieser Adresse, also den Speicher bis zum nächsten NUL Byte, anzeigen lassen.

Normalerweise liegt der user-supplied Format String auch auf dem Stack, und in allen Fällen über dem aktuellen Stack-Pointer, wenn die Format-Funktion aufgerufen wird.
Dass heisst, wenn man nur genügend vom Stack pop'ed, indem man zum Beispiel "%u" oder "%08x" Parameter verwendet, landet man irgendwann im Format-String selber.

Beispiel:

"AAA0AAA1_%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x.%08x"

Ersetzt man "AAA0" durch die im little-endian Format gespeicherte Adresse und pop'ed den Stack soweit, bis der aktuelle Format Parameter der gewünschte ist, so kann man mit "%s" den Speicher bei der gewünschten Adresse anzeigen lassen.

Beispiel:
Adresse = 0x08480110
Adresse als little endian String: "\x10\x01\x48\x08" (strlen () = 4)

"\x10\x01\x48\x08_%08x.%08x.%08x.%08x.%08x.%08x.|%s|"

Durch intelligentes Erhöhen der Adresse kann so der gesammte Speicher ausgelesen werden. Es ist sogar möglich, remote (zum Beispiel bei wuftpd) ein coredump-ähnliches Image anzulegen und daraus die Binary zu rekonstruieren [2].
Dies kann hilfreich sein, um zum Beispiel die Fehlerursache für einen fehlgeschlagenden Exploit zu finden.

Sollte man durch das 4-Byte pop'pen nicht direkt auf dem Buffer-boundary landen, so ist der Buffer entsprechend zu padden. Dies ist analog zu herkömmlichen Bufferoverflows.

<< - < - > - >>