part 3 finished, format
This commit is contained in:
parent
d717aef0f7
commit
b6d4caaccc
7 changed files with 71 additions and 45 deletions
|
@ -43,7 +43,7 @@ Die anschließende Funktion
|
||||||
|
|
||||||
gibt eine 0 zurück wenn man gewonnen hat.
|
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}
|
\subsection{Versuchen zu gewinnen}
|
||||||
|
|
||||||
|
@ -57,25 +57,26 @@ Das kompilierte Programm mit \verb|gdb bufferOverflow| starten. Einen Breakpoint
|
||||||
|
|
||||||
Getätigte Eingaben im Programm:
|
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{figure}[H]
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{subfigure}[b]{0.48\textwidth}
|
\includegraphics[width=0.8\textwidth]{bufferOverflow/01-input}
|
||||||
\includegraphics[width=\textwidth]{bufferOverflow/01-input}
|
\caption{Erste Eingabe}
|
||||||
\caption{Erste Eingabe}
|
\label{fig: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}
|
\end{center}
|
||||||
\caption{Erste Eingaben und Breakpoint}
|
|
||||||
\label{fig:Erste Eingaben und Breakpoint}
|
|
||||||
\end{figure}
|
\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:
|
Die analyse des Stackpointers sieht folgendermaßen aus:
|
||||||
|
|
||||||
\begin{figure}[H]
|
\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{figure}[H]
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{subfigure}[b]{0.48\textwidth}
|
\includegraphics[width=0.8\textwidth]{bufferOverflow/04-newrun}
|
||||||
\includegraphics[width=\textwidth]{bufferOverflow/04-newrun}
|
\caption{Zweite Eingabe}
|
||||||
\caption{Zweite Eingabe}
|
\label{fig: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}
|
\end{center}
|
||||||
\caption{Zweite Eingaben und Stackpointer}
|
|
||||||
\label{fig:Zweite Eingaben und Stackpointer}
|
|
||||||
\end{figure}
|
\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{figure}[H]
|
||||||
\begin{center}
|
\begin{center}
|
||||||
|
@ -128,9 +128,7 @@ Die erneute Ausgabe der wichtigen Adressen zeigt uns nun, dass der EIP mit \verb
|
||||||
\end{center}
|
\end{center}
|
||||||
\end{figure}
|
\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.
|
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.
|
||||||
|
|
||||||
\newpage
|
|
||||||
|
|
||||||
Damit wird das Programm noch einmal gestartet:
|
Damit wird das Programm noch einmal gestartet:
|
||||||
|
|
||||||
|
@ -140,19 +138,18 @@ Und es wird 5 mal in Folge gewonnen:
|
||||||
|
|
||||||
\begin{figure}[H]
|
\begin{figure}[H]
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\begin{subfigure}[b]{0.48\textwidth}
|
\includegraphics[width=0.8\textwidth]{bufferOverflow/07-win-1}
|
||||||
\includegraphics[width=\textwidth]{bufferOverflow/07-win-1}
|
\caption{Gewinn - Teil 1}
|
||||||
\caption{Gewinn-1}
|
\label{fig:Gewinn - Teil 1}
|
||||||
\label{fig:Gewinn-1}
|
\end{center}
|
||||||
\end{subfigure}
|
\end{figure}
|
||||||
\begin{subfigure}[b]{0.48\textwidth}
|
|
||||||
\includegraphics[width=\textwidth]{bufferOverflow/08-win-2}
|
\begin{figure}[H]
|
||||||
\caption{Gewinn-2}
|
\begin{center}
|
||||||
\label{fig:Gewinn-2}
|
\includegraphics[width=0.8\textwidth]{bufferOverflow/08-win-2}
|
||||||
\end{subfigure}
|
\caption{Gewinn - Teil 2}
|
||||||
|
\label{fig:Gewinn - Teil 2}
|
||||||
\end{center}
|
\end{center}
|
||||||
\caption{Gewinn}
|
|
||||||
\label{fig:Gewinn}
|
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
\subsection{Stack}
|
\subsection{Stack}
|
||||||
|
|
27
Lab02/documentation/format-string/format-string.tex
Normal file
27
Lab02/documentation/format-string/format-string.tex
Normal 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.
|
BIN
Lab02/documentation/images/format-string/done.png
Executable file
BIN
Lab02/documentation/images/format-string/done.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
BIN
Lab02/documentation/images/format-string/stack.png
Executable file
BIN
Lab02/documentation/images/format-string/stack.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 83 KiB |
|
@ -103,6 +103,7 @@
|
||||||
\listoffigures
|
\listoffigures
|
||||||
\include{bufferOverflow/bufferOverflow}
|
\include{bufferOverflow/bufferOverflow}
|
||||||
\include{shell/shell}
|
\include{shell/shell}
|
||||||
|
\include{format-string/format-string}
|
||||||
|
|
||||||
\printbibliography[title=Literaturverzeichnis]
|
\printbibliography[title=Literaturverzeichnis]
|
||||||
|
|
||||||
|
|
|
@ -40,8 +40,8 @@ Das ausführen der exploit mit einem größeren NOP Sled zeigt nun die ungefähr
|
||||||
\begin{figure}[H]
|
\begin{figure}[H]
|
||||||
\begin{center}
|
\begin{center}
|
||||||
\includegraphics[width=0.9\textwidth]{shell/03-stack}
|
\includegraphics[width=0.9\textwidth]{shell/03-stack}
|
||||||
\caption{Position in dem der NOP-Sled liegt}
|
\caption{Position des NOP-Sled}
|
||||||
\label{fig:Position in dem der NOP-Sled liegt}
|
\label{fig:Position des NOP-Sled}
|
||||||
\end{center}
|
\end{center}
|
||||||
\end{figure}
|
\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 ASLR (Address space layout randomization) - das Programm landet an unterschiedlichen Speicherstellen
|
||||||
\item Never Execute Bit (NX-BIT) - Stellen als ``nicht ausführbar'' markieren
|
\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 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}
|
\end{list}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,6 @@
|
||||||
\vfill
|
\vfill
|
||||||
\raggedright{}
|
\raggedright{}
|
||||||
\HRule{13pt}{1pt} \\
|
\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}
|
\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}
|
\end{titlepage}
|
||||||
|
|
Reference in a new issue