(c) teso. all rights reversed.
exploiting format string vulnerabilities - Direct Parameter Access

Direct Parameter Access

Es gibt noch eine grosse Vereinfachung, die bewußt weggelassen wurde, da sie nicht überall vorhanden ist.

Es ist bei vielen LibC's möglich, direkt bestimmte Parameter auf dem Stack an einen Format-Parameter zu binden. Dazu verwendet man den '$'-qualifier. Zum Beispiel:
        printf ("%6$d\n", 6, 5, 4, 3, 2, 1);
Gibt 1 aus, da man den "%d" Parameter explizit dazu anweist den 6. Stack-Parameter für die "%d" Operation zu verwenden. So kann der komplette Stackpop eingespart werden, wenn man so verfährt:
        char    foo[4];

        printf ("%1$16u%2$n"
                "%1$16u%3$n"
                "%1$32u%4$n"
                "%1$64u%5$n",
                1,
                (int *) &foo[0], (int *) &foo[1],
                (int *) &foo[2], (int *) &foo[3]);
Weist foo den Wert "\x10\x20\x40\x80" zu.
Leider klappt dieser direkte Zugriff bei Free-/Net- und OpenBSD nur bedingt: sie erlauben nur Werte, die kleiner als Acht sind. Die GNU C Library und die IRIX LibC, sowie einige andere erlauben beliebig große Werte. Wählt man den Wert jedoch zu gross, in der Hoffnung einen Overflow zu erzeugen, um quasi negativ zu Indizieren (d.h. "%-1$d"), so wird man enttäuscht, es kommt nur zu Abstürzen.

Deshalb sollte man, wenn möglich immer Stackpop-Techniken verwenden, da sie nahezu überall funktionieren. Wenn die Vulnerability natürlich nur auf Systemen existiert, die den Direct Parameter Access erlauben, so kann man davon gebrauch machen (wie zum Beispiel beim irx_telnetd.c Exploit von LSD).

<< - < - > - >>