Danach kann das Programm mit \verb|./bufferOverlow| gestartet werden.
\subsection{Hints}
Es wurden verschlüsselte Tipps beigesteuert. Zum verschlüsseln wurde folgender Befehl ausgeführt:
\begin{lstlisting}[breaklines]
echo "This is your first hint" | openssl des -nosalt -e -k 12345678 -a
\end{lstlisting}
Zum entschlüsseln muss lediglich der verschlüsselte String mit dem angegebenen secret an openssl übergeben werden.
\begin{lstlisting}[breaklines]
echo "ilEbsYAeS8Prp7xXI5MPqSEyOOKoyXbCotRFSskidgs=" | openssl des -nosalt -d -k 12345678 -a
\end{lstlisting}
Leider konnten die angegebenen Tipps nicht entschlüsselt werden. Das obige Beispiel funktioniert ohne Probleme, kann aber nicht auf die in der PDF angegebenen Tipps angewandt werden.
Das Programm \verb|bufferOverflow.c| beginnt mit der Eingabe des Namens mit Hilfe der Funktion \verb|fgets|\footnote{\href{https://www.tutorialspoint.com/c_standard_library/c_function_fgets.htm}{tutorialspoint - fgets}}. Dabei wird die Länge des eingegebenen Benutzernamens in einem char Array der Länge 16 gespeichert. Ein Buffer Overflow wird hier abgefangen, da nur so viele Zeichen eingegeben werden können, wie \verb|sizeof(username)| zurück gibt.
Dann werden nacheinander die geratenen Zahlen eingelesen. Man muss alle 3 Zahlen richtig raten, damit man das Spiel gewinnt. Es werden mit \verb|rand()| zufällige Zahlen generiert.
Aber in der Funktion kann ein Buffer Overflow stattfinden, da \verb|argv[1]| mit \verb|strcpy()| ohne Begrenzung in ein limitiertes 16 Byte großes char array kopiert wird. Dabei werden im Stack Werte überschrieben. Genau dort kann der Angriff stattfinden.
Das kompilierte Programm mit \verb|gdb bufferOverflow| starten. Einen Breakpoint in der Calculate-Funktion bei Zeile 24 mit \verb|b 24| setzen. Dann mit
Wie zu sehen ist, wurden die wichtigen Pointer noch nicht erreicht. Es ist aber zu erkennen, dass die geratenen 20xA direkt davor ankommen. Somit könnte man mit 28xA und der Adresse der Win-Funktion, den Ablauf der Funktion ändern.
Speicheraddresse der Win-Funktion mit \verb"objdump -d ./bufferOverflow | grep win" herausfinden. Grep gibt 2 Zeilen aus. Einmal die Funktion selber und die Position in \verb|main()| in der Sie aufgerufen wird.
Die erneute Ausgabe der wichtigen Adressen zeigt uns nun, dass der EIP mit \verb|\x41\x41\x41\x41| überschrieben wurde (Abbildung \ref{fig:Zweiter Stackpointer}) und deshalb korrekt gesetzt werden sollte. Deswegen endet das weitere Ausführen, nach einer erfolgreichen Runde in einem segmentation fault (Abbildung \ref{fig:Segmentation Fault}).
Dazu kann einfach die normal gesetzte Speicheradresse genutzt werden. Diese lautete wie in Abbildung \ref{fig:Erster Stackpointer} zu sehen \verb|0xbffff2f8| welches in \verb|\xe8\xf2\xff\xbf| umgewandelt wird.
\subsection{Warum so gefährlich \& was getan werden muss}
Veränderung des Ablaufs der Software kann ewaige Authentifizierung und Validierung ausschalten und somit Zugriff auf Informationen erlangt werden.
Gegenmaßnahmen:
Um den Buffer Overflow zu verhindern, sollten Funktionen wie strcpy vermieden werden. Im Beispielprogramm wurde die Eingabe des Nutzers direkt an die Funktion als Pointer weitergegeben anstatt davor eine Validierung durchzuführen.