Stack auslesen und beschreiben mit printf

  • Themenstarter Themenstarter caffeine
  • Beginndatum Beginndatum
C

caffeine

Guest
Hey Zusammen,

Wie der Titel schon sagt geht es mir um das Auslesen des Stacks auf Basis folgenden C-Codes:

!_vuln.c
Code:
#include <stdio.h>

int main(int argc, char* argv[])
{
	printf(argv[1]);
	/* code me */
}

Im Code werden keine Format-Strings verwendet, was wiederum in Bezug auf die Sicherheit kritisch ist.Man kann theoretisch Teile des Staks auslesen und sogar beschreiben.Das Lesen stell ich mir so vor:

Lesen: ./vuln %x.%x.%x.%x.%s liest das erste Element auf dem Stack
Hier -> (null) In dem Zusammenhang stellt sich mir die Frage, wieso ich folgende Ausgabe bekomme:

68be1ba0.68be1bb8.68be1c00.5e5dda.(null)

Soweit ich weiß liegen doch bis dato nur der EBP und die Rücksprungadresse auf dem Stack also was sind das für Werte ? EBP+0 und EBP+4 sind belegt und alles echt größer EBP+4 sollte frei sein.

Schreiben: Funktioniert mit %n,

Aber wie genau, dass ist mir noch nicht klar, mein Vorschlag wäre:
./vuln %x.%x.%x.%x.5%n , um 5 in den Stack zu schreiben (?)


Bin über jede Hilfe dankbar und schönen Abend noch,

tanye
 

Ok also hatte ich Recht, soweit ich das verstanden habe.Danke noch einmal für die pdf.

Schreiben: ./vuln %x.%x.%x.%x.5%n.10%n.15%n
-> Schreibt 5,10,15 in den Stack.

Lesen: ./vuln %x.%x.%x.%x.%x.%x.%x

liest die ersten drei Objekte aus dem Stack in Hex.Aber das klärt immer noch nicht was die ersten 4 sind.Hat da jemand noch ne Idee ?Wie gesagt weiß ich nur von EBP und Rücksprungadresse die bis dahin auf dem Stack liegen sollten.Dann wird mein argv[1] noch auf den Stack gepusht höchstens, aber das erklärt die Ausgabe noch immer nicht (?)
 
Also:
alles echt größer EBP+4 sollte frei sein.
Freier Stack muss nicht unbedingt mit 0 initialisiert sein ;)
Vor allem, wenn da schon Code vorher ausgeführt wurde.

Wie gesagt weiß ich nur von EBP und Rücksprungadresse die bis dahin auf dem Stack liegen sollten.Dann wird mein argv[1] noch auf den Stack gepusht höchstens, aber das erklärt die Ausgabe noch immer nicht (?)
Ja, und auf welche magische Weise erhält der Code nun überhaupt argv & argc?

Nur als Tipp: "main" ist der logische Einstiegspunkt (für den eigenen Code) - keineswegs aber der tatsächliche.
Einfach mal "gcc -S vuln.c" ausführen, sich die Assembly ansehen und dann "objdump -f vuln" (EntryPoint) und "objdump -S vuln" damit vergleichen :wink:
 
Zurück
Oben