Yoghurt hat geschrieben:Könnt ihr auch noch erklären, warum seine Lösung richtig ist? Würde mich interessieren.

Der Schlüssel ist diese harmlos scheinende Zeile:
Bei normaler Eingabe funktioniert das auch korrekt. Jedoch kann der Benutzer nun Format-Specifier wie %d, %X oder %c angeben. Dann nimmt* printf() diese Parameter vom Stack und gibt sie aus. Da liegt aber nix, was zu printf() gehört, sondern deine lokalen Variablen wie input, password usw. Mit etwas herumspielen kannst du die Position von password herausfinden. Dabei gibst du am besten ein kurzes Passwort ein. Wenn du dann einige %X im Format angibst, erkennst du den Speicherbereich an den vielen 0-Werten im ungenutzten Teil des Arrays. Dann kannst du dich mit deinen Parametern annähern. Immer nur %c funktioniert nicht, ich schätze mal wegen bestimmter ASCII-Steuerzeichen. Am besten liest du mit %X aus. Dabei musst du beachten, dass ein ganzer Integer gelesen wird, der im Speicher im Little Endian Format liegt und du jeweils für Blöcke der Größe eines Integers die Reihenfolge ändern musst. Das wars dann im Prinzip und du kannst den hexadezimalen ASCII-Wert in password auslesen.
Lösung: Niemals einen variablen Format-String verwenden! Willst du einen String ausgeben, machst du das einfach so:
bzw.
* Ich bin mir nicht sicher, ob printf() die Variablen wirklich vom Stack nimmt, oder ob sie einfach (zur Optimierung) in Register geschoben werden. Ich werde am Abend noch ein ähnliches Beispiel posten, das nicht so funktioniert wie ich mir das vorstelle.