(c) teso. all rights reversed.
exploiting format string vulnerabilities - short write

short write

Es kann auch "abgekürzt" werden, indem man jeweils zwei Bytes auf einmal schreibt: "%hn" erwartet einen (short int *). Dies funktioniert zwar meisten, man sollte jedoch darauf verzichten, da es (ausser bei extrem kurzem Format-Strings) keine Vorteile bringt, und auf alten GNU C Libraries (libc5) nicht funktioniert.

Ob es funktioniert hängt nämlich davon ab, ob der format-Funktion-interne Zähler der ausgegebenen Zeichen auch dann noch mitzählt, wenn er bereits die Buffergröße überschritten hat.

Für RISC-Systeme ist der "%hn" Funktionalität wesentlich mehr Beachtung zu schenken, da man damit short int's schreiben kann, und so indirekt die align-limitierung umgehen kann, die auf diesen Plattformen existiert. Ein Byte-weises schreiben ist dort oft ganz unmöglich.

Das Schreiben sieht dann so aus:
        printf ("%.29010u%hn%.32010u%hn", 1, (short int *) &foo[0],
                1, (short int *) &foo[2]);
Es funktioniert sonst analog zur 4-byte Technik.
Zusätzliche Schwierigkeiten können auftreten, wenn man mit 64bit big-endian Architekturen arbeitet, da hier oft NUL Bytes in den Adressen vorhanden sind, die man beschreiben will.

<< - < - > - >>