part 3 finished, format

This commit is contained in:
Florian Hoss 2022-05-02 11:32:46 +02:00
parent d717aef0f7
commit b6d4caaccc
7 changed files with 71 additions and 45 deletions

View file

@ -43,7 +43,7 @@ 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. Da können wir angreifen.
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.
\subsection{Versuchen zu gewinnen}
@ -57,25 +57,26 @@ Das kompilierte Programm mit \verb|gdb bufferOverflow| starten. Einen Breakpoint
Getätigte Eingaben im Programm:
\verb|Username: Florian, Input1: 1, Input2: 1, Input3: 1|
Username: \verb|Florian|, Input1: \verb|1|, Input2: \verb|1|, Input3: \verb|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}
\includegraphics[width=0.8\textwidth]{bufferOverflow/01-input}
\caption{Erste Eingabe}
\label{fig:Erste Eingabe}
\end{center}
\caption{Erste Eingaben und Breakpoint}
\label{fig:Erste Eingaben und Breakpoint}
\end{figure}
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.9\textwidth]{bufferOverflow/02-breakpoint}
\caption{Breakpoint}
\label{fig:Breakpoint}
\end{center}
\end{figure}
\newpage
Die analyse des Stackpointers sieht folgendermaßen aus:
\begin{figure}[H]
@ -103,22 +104,21 @@ Damit werden 28x'A' und die Adresse der Win-Funktion als argument der Software m
\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}
\includegraphics[width=0.8\textwidth]{bufferOverflow/04-newrun}
\caption{Zweite Eingabe}
\label{fig:Zweite Eingabe}
\end{center}
\caption{Zweite Eingaben und Stackpointer}
\label{fig:Zweite Eingaben und Stackpointer}
\end{figure}
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{figure}[H]
\begin{center}
\includegraphics[width=0.8\textwidth]{bufferOverflow/05-stackpointer}
\caption{Zweiter Stackpointer}
\label{fig:Zweiter Stackpointer}
\end{center}
\end{figure}
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. Deswegen endet das weitere Ausführen, nach einer erfolgreichen Runde in einem segmentation fault (Abbildung \ref{fig:Segmentation Fault}).
\begin{figure}[H]
\begin{center}
@ -128,9 +128,7 @@ Die erneute Ausgabe der wichtigen Adressen zeigt uns nun, dass der EIP mit \verb
\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
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.
Damit wird das Programm noch einmal gestartet:
@ -140,19 +138,18 @@ 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}
\includegraphics[width=0.8\textwidth]{bufferOverflow/07-win-1}
\caption{Gewinn - Teil 1}
\label{fig:Gewinn - Teil 1}
\end{center}
\end{figure}
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.8\textwidth]{bufferOverflow/08-win-2}
\caption{Gewinn - Teil 2}
\label{fig:Gewinn - Teil 2}
\end{center}
\caption{Gewinn}
\label{fig:Gewinn}
\end{figure}
\subsection{Stack}

View file

@ -0,0 +1,27 @@
\section{Format String Exploitation}
Der erste Versuch ist, viele Format-Strings als Vorname und Nachname einzugeben und das Ergebnis zu beobachten. Mit einem Debugger kann die Speicheraddresse der 3 Wichtigen Variablen ausgelesen werden.
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.9\textwidth]{format-string/stack}
\caption{Vorname, Nachname und Key im Stack}
\label{fig:Vorname, Nachname und Key im Stack}
\end{center}
\end{figure}
Der Key ist im Speicher unter der Adresse 0xbffff2ec abgespeichert und kann mit dem Format String \verb|%19$i| erreicht und dezimal ausgegeben werden.
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.8\textwidth]{format-string/done}
\caption{Zahl richtig geraten}
\label{fig:Zahl richtig geraten}
\end{center}
\end{figure}
\subsection{Warum so gefährlich \& was getan werden muss}
Durch einen Format String Exploit kann jede Stelle im Speicher ausgelesen werden. Damit ist die Vertraulichkeit, ein Teil der ``CIA'', gebrochen.
Format Strings sollten immer als Teil des Programms angegeben werden, nicht als Teil der Eingabe. Außerdem könnten die Formatzeichenfolgen als konstanten deklariert werden.

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

View file

@ -103,6 +103,7 @@
\listoffigures
\include{bufferOverflow/bufferOverflow}
\include{shell/shell}
\include{format-string/format-string}
\printbibliography[title=Literaturverzeichnis]

View file

@ -40,8 +40,8 @@ Das ausführen der exploit mit einem größeren NOP Sled zeigt nun die ungefähr
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.9\textwidth]{shell/03-stack}
\caption{Position in dem der NOP-Sled liegt}
\label{fig:Position in dem der NOP-Sled liegt}
\caption{Position des NOP-Sled}
\label{fig:Position des NOP-Sled}
\end{center}
\end{figure}
@ -73,6 +73,7 @@ Zusätzlich muss damit auch der EBP getroffen werden. Der shell-code ist 106 byt
\item ASLR (Address space layout randomization) - das Programm landet an unterschiedlichen Speicherstellen
\item Never Execute Bit (NX-BIT) - Stellen als ``nicht ausführbar'' markieren
\item Stack Canaries - Eine zufällige Zahl auf dem Stack platzieren und vor dem Return prüfen, ob sie überschrieben wurde
\item Keine unsicheren Funktionen Nutzen (strcpy, gets, ...)
\end{list}

View file

@ -20,6 +20,6 @@
\vfill
\raggedright{}
\HRule{13pt}{1pt} \\
\titleemph{Datum:} 25.04.2022 \\
\titleemph{Datum:} 02.05.2022 \\
\titleemph{Git:} \href{https://git.unjx.de/flo/SWB6-ITSec/src/branch/master/Lab02}{https://git.unjx.de/flo/SWB6-ITSec/src/branch/master/Lab02}
\end{titlepage}