\section{Part 1: Buffer Overflow}

\subsection{Kompilieren}

Zum kompilieren des C-Programmes wird GCC verwendet. Folgender Befehl wird ausgeführt:

\begin{lstlisting}[breaklines]
gcc -g --no-pie -z execstack -fno-stack-protector -D_FORTIFY_SOURCE=0 bufferOverflow.c -o bufferOverflow
\end{lstlisting}

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.

Fehlermeldung:
\begin{verbatim}
bad decrypt
\end{verbatim}

\subsection{Analyse}

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.

Die anschließende Funktion

\verb|calculate(argv[1], input1, input2, input3, number1, number2, number3)| 

gibt eine 0 zurück wenn man gewonnen hat.

Aber in der Funktion wird 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.

\subsection{Debugging}

Zum debuggen wird der Befehl \verb|gdb bufferOverflow| eingegeben. Damit wird der GDB Debugger geöffnet. Zum setzen des ersten Breakpoints bei \verb|main| geben wir \verb|b main| ein. Zum setzen eines Argumentes muss \verb|set args <argument>| eingegeben werden. Danach können wir mit \verb|run| das Programm starten und uns mit \verb|s| mit einzelnen Schritten bewegen. Jederzeit können Variablen mit z.B. \verb|p number1| abgefragt werden. Der Anfang des Stacks kann somit mit \verb|p $sp| und 40 Byte des Stacks mit \verb|x/20x $sp| in HEX oder mit \verb|x/20 $sp| in DEC abgefragt werden. Die Eingabe \verb|i r esp abp eip| gibt die wichtigen Pointer aus.

Wenn man den Breakpoint auf \verb|calculate()| setzt, einen schritt über \verb|strcpy(name,text)| macht, bekommt man einen Segmentation fault.

\subsection{Stack}

Hinweis: \verb|"A" ASCII| wird als \verb|0x41| geschrieben.

Hinweis: \verb|"B" ASCII| wird als \verb|0x42| geschrieben.

Abstand zwischen name (\verb|0xbffff2a0|) und input (\verb|0xbffff2b4|) sind 20 Byte. Jeder Int belegt 4 Byte auf dem Stack. Somit müsste man \[20 + 6 * 4 Byte = 44 Byte\] mit Zahlen belegen damit man immer gewinnt.

\begin{verbatim}
argv[1]: AAAAAAAAAAAAAAAA (16 Byte)
+ BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB (44 Byte)
\end{verbatim}

\begin{verbatim}
Username: Florian
Input1: 1
Input2: 1
Input3: 1
\end{verbatim}

\begin{tabular}{|l|l||r|r|}
    \hline
    \multicolumn{2}{|c||}{\textbf{Basic Information}} & \multicolumn{2}{c|}{\textbf{Values at Line}} \\
    Memory Address & Variable Name & 21 - calculate() & 24 - strcpy() \\
    \hline
    \verb|0xbffff304| & number3 & \verb|0x00000003| & \verb|0x00000003| \\
    \verb|0xbffff300| & number2 & \verb|0x00000003| & \verb|0x00000003| \\
    \verb|0xbffff2fc| & number1 & \verb|0x00000001| & \verb|0x00000001| \\
    \verb|0xbffff2f0| & Input3 & \verb|0x00000001| & \verb|0x00000001| \\
    \verb|0xbffff2ec| & input2 & \verb|0x00000001| & \verb|0x00000001| \\
    \verb|0xbffff2e8| & input1 & \verb|0x00000001| & \verb|0x00000001| \\
    \hline
    \verb|0xbffff2e4| & & \verb|0xb7e54196| & \\
    \verb|0xbffff2e0| & & \verb|0xffffffff| & \\
    \verb|0xbffff2dc| & & \verb|0x08048871| & \\
    \verb|0xbffff2d8| & & \verb|0x08049ff4| & \\
    \verb|0xbffff2d4| & & \verb|0x00000016| & \\
    \verb|0xbffff2d0| & & \verb|0xb7fc73e4| & \\
    \verb|0xbffff2cc| & & \verb|0x08048425| & \\
    \verb|0xbffff2c8| & & \verb|0x00000004| & \\
    \verb|0xbffff2c4| & EBP & \verb|0xbffff2e8| & \\
    \verb|0xbffff2c0| & ESP & \verb|0x08048a04| & \\
    \hline
    \verb|0xbffff| & name & & 0x41414141 \\
    \verb|0xbffff| & name & & 0x41414141 \\
    \verb|0xbffff| & name & & 0x41414141 \\
    \verb|0xbffff| & name & & 0x41414141 \\
    \hline
    \verb|0xbffff| & \multicolumn{3}{c|}{\textit{}} \\
    \verb|0xbffff| & &  \\
    \verb|0xbffff| & Return & 0xbffff537 & \\
    \hline
    \verb|0xbffff| & ESP & 0xbffff290 &\\
    \hline
\end{tabular}

