diff --git a/Assignment 5 - Software Security - Teil 1/abgabe.tex b/Assignment 5 - Software Security - Teil 1/abgabe.tex index 36c563e..61f8781 100644 --- a/Assignment 5 - Software Security - Teil 1/abgabe.tex +++ b/Assignment 5 - Software Security - Teil 1/abgabe.tex @@ -321,7 +321,7 @@ int check_authentication(char *password) { int auth_flag = 0; - if((x == 0x21) && (y == 0x6b) && (z == 4f)) { + if((x == 0x21) && (y == 0x6b) && (z == 0x4f)) { auth_flag = 1; } @@ -331,9 +331,11 @@ int check_authentication(char *password) { Die gehärtete Funktion deklariert \texttt{auth\_flag} nicht mehr als Erstes innerhalb der Funktion. Stattdessen werden zunächst drei Variablen vom Typ \texttt{char} mit dem Wert 0 initialisiert. In der IF-Abfrage, in der das Passwort mit dem String \texttt{swordfish} verglichen wird, wird bei übereinstimmendem Passwort nicht mehr direkt \texttt{auth\_flag} auf 1 gesetzt. Stattdessen erhalten die drei zuvor deklarierten Variablen spezifische Werte. Anschließend wird \texttt{auth\_flag} mit 0 initialisiert. In einer zweiten IF-Abfrage wird überprüft, ob die drei Variablen die Werte aufweisen, die sie bei korrektem Passwort haben sollten. Falls dies der Fall ist, wird \texttt{auth\_flag} auf 1 gesetzt. Zum Abschluss wird \texttt{auth\_flag} zurückgegeben. Die nicht gehärtete Funktion, setzt direkt nach dem Vergleich den Rückgabewert, falls das Passwort korrekt ist, auf 1. Danach wird dieser zurückgegeben. - Da die 3 Variablen vor dem \texttt{password\_buffer} deklariert werden, liegen sie an einer höheren Speicheradresse im Stack. Somit überschreibt, falls der Input \texttt{char *password} einen String länger als 12 Byte enthält, die unsichere Funktion \texttt{strcpy} diese drei Variablen. Somit muss das Passwort 15 Byte lange sein (12 Byte Buffer + 3 Bytes). Die ersten zwölf Byte sorgen dafür, dass das 13. Byte die erste der drei Variablen überschreibt, etc. Somit müssen die 3 letzten Byte die Werte haben, auf die in der 2. IF-Abfrage geprüft wird, damit die \texttt{auth\_flag} auf 1 gesetzt wird. Diese können mit einem Debugger einfach gefunden werden. + Da die 3 Variablen vor dem \texttt{password\_buffer} deklariert werden, liegen sie an einer höheren Speicheradresse im Stack. Somit überschreibt, falls der Input \texttt{char *password} einen String länger als 12 Byte enthält, die unsichere Funktion \texttt{strcpy} diese drei Variablen. Somit muss das Passwort 15 Byte lange sein (12 Byte Buffer + 3 Bytes). Die ersten zwölf Byte sorgen dafür, dass das 13. Byte die erste der drei Variablen überschreibt, etc. Somit müssen die 3 letzten Byte die Werte haben, auf die in der 2. IF-Abfrage geprüft wird, damit die \texttt{auth\_flag} auf 1 gesetzt wird. Die Endianess muss beachtet werden. Diese können mit einem Debugger einfach gefunden werden. - \item Anbei das ausgefüllte Speicherlayout. Anbei Bilder, die unser ausgefülltes Layout bestätigen. + \item Anbei das ausgefüllte Speicherlayout. Anbei Bilder, die unser ausgefülltes Layout bestätigen. + + Dem Bild kann entnommen werden, dass der Stack der Funktion \texttt{check\_authentication} bei \texttt{0xffffd500} startet und bis \texttt{0xffffd4e0} geht. Somit hat der Stack eine Größe von 32 (+4 Byte Parameter \texttt{@0xffffd500}), also 36 Byte. Außerdem kann dem Bild der aktuelle Stackinhalt entnommen werden. Der Stack ist keine 40 Byte groß, weshalb die Vorlage nicht genau passt und ein Speicherwort zu viel Platz ist. \includegraphics[width=\textwidth]{gdb.png} \includepdf[pages=1]{h5_ss24.pdf}