Finde die Sicherheitslücke ;)

Schnelle objektorientierte, kompilierende Programmiersprache.
nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Finde die Sicherheitslücke ;)

Beitrag von nufan » Mi Jan 16, 2013 9:15 pm

Xin hat geschrieben:

Code: Alles auswählen

#include <stdio.h>
  fgets( password, sizeof( password ), stdin );
  passwordLength = strlen( password );
  password[passwordLength - 1] = '\0';
Gebe ich kein Passwort ein, schreibe ich vor das password-Feld?
Naja als "normaler" Nutzer drückt man wohl die Enter-Taste, womit das Newline im String wäre ^^ Aber es stimmt schon, ganz korrekt ist das nicht.
Xin hat geschrieben:

Code: Alles auswählen

    printf( input );
printf( "%s", input ); oder fputs?
Damit bist du schon nah dran ;)

Benutzeravatar
Yoghurt
Beiträge: 79
Registriert: Fr Nov 16, 2012 8:01 am
Wohnort: Niederbayern

Re: Finde die Sicherheitslücke ;)

Beitrag von Yoghurt » Do Jan 17, 2013 7:40 am

Ich denke mfro hat das Rätsel ja schon gelöst. :)

Könnt ihr auch noch erklären, warum seine Lösung richtig ist? Würde mich interessieren. :)
"Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why."

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Finde die Sicherheitslücke ;)

Beitrag von nufan » Do Jan 17, 2013 11:15 am

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:

Code: Alles auswählen

printf( input );
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:

Code: Alles auswählen

printf( "%s", input );
bzw.

Code: Alles auswählen

puts( input );
* 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.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Finde die Sicherheitslücke ;)

Beitrag von Xin » Do Jan 17, 2013 12:34 pm

Lustig wird's mit %n an richtigen Stellen... ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Finde die Sicherheitslücke ;)

Beitrag von mfro » Do Jan 17, 2013 12:40 pm

dani93 hat geschrieben:Immer nur %c funktioniert nicht, ich schätze mal wegen bestimmter ASCII-Steuerzeichen.
Das funktioniert alleine schon deswegen nicht, weil beide Puffer gleich lang sind. Wenn du dann zwei Zeichen (% und c) in den Eingabepuffer eingeben mußt, um eins aus dem Passwort-Array zu Gesicht zu bekommen, kommst du nie an den Pufferanfang, weil der Eingabepuffer logischerweise vorher voll ist.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Finde die Sicherheitslücke ;)

Beitrag von nufan » Do Jan 17, 2013 12:42 pm

mfro hat geschrieben:
dani93 hat geschrieben:Immer nur %c funktioniert nicht, ich schätze mal wegen bestimmter ASCII-Steuerzeichen.
Das funktioniert alleine schon deswegen nicht, weil beide Puffer gleich lang sind. Wenn du dann zwei Zeichen (% und c) in den Eingabepuffer eingeben mußt, um eins aus dem Passwort-Array zu Gesicht zu bekommen, kommst du nie an den Pufferanfang, weil der Eingabepuffer logischerweise vorher voll ist.
Das natürlich auch. Aber wenn ich davor ein paar %X mache und dann erst mit %c anfange, funktioniert das auch nicht (bin mir ziemlich sicher, kanns im Moment leider nicht testen).
Xin hat geschrieben:Lustig wird's mit %n an richtigen Stellen... ^^
Stimmt ^^ Darüber hab ich auch erst vor kurzem gelesen, wusst gar nicht, dass das geht ^^ Ich hab das aber noch nie verwendet und auch nirgends gesehen. Auch der Fall, dass ein int-Zeiger (also seine Adresse, nicht sein Wert) ausgegeben wird, sehe ich als eher unwahrscheinlich.

Antworten