[Assignment-5] added text solutioks 4 (data-only atty attack)
All checks were successful
Latex Build / build-latex (Assignment 4 - Protokollsicherheit (Praxis)) (push) Successful in 1m6s
Latex Build / build-latex (Assignment 5 - Software Security - Teil 1) (push) Successful in 1m6s

This commit is contained in:
Sascha Tommasone 2024-06-09 22:31:37 +02:00
parent 63d0a88ba8
commit c8eef2fc34
Signed by: saschato
GPG key ID: 751068A86FCAA217
4 changed files with 79 additions and 8 deletions

View file

@ -1,4 +0,0 @@
# Latex Outputs
*.log
*.synctex.gz
*.pdf

View file

@ -12,6 +12,7 @@
\usepackage{algpseudocode} \usepackage{algpseudocode}
\usepackage{xifthen} \usepackage{xifthen}
\usepackage{xcolor} \usepackage{xcolor}
\usepackage{pdfpages}
\usepackage[a4paper,lmargin={2cm},rmargin={2cm},tmargin={2.5cm},bmargin = {2.5cm},headheight = {4cm}]{geometry} \usepackage[a4paper,lmargin={2cm},rmargin={2cm},tmargin={2.5cm},bmargin = {2.5cm},headheight = {4cm}]{geometry}
\usepackage{amsmath,amssymb,amstext,amsthm} \usepackage{amsmath,amssymb,amstext,amsthm}
\usepackage[shortlabels]{enumitem} \usepackage[shortlabels]{enumitem}
@ -234,7 +235,7 @@ Key to Flags:
p (processor specific) p (processor specific)
\end{lstlisting} \end{lstlisting}
\item Die in dem Code angegebenen labels können wie folgt eingeteilt werden: \item Die in dem Code angegebenen Labels können wie folgt eingeteilt werden:
\begin{enumerate}[<A>:] \begin{enumerate}[<A>:]
\item .bss \item .bss
\item .data \item .data
@ -247,7 +248,7 @@ Key to Flags:
\end{exercise} \end{exercise}
\begin{exercise}[Crackme]{2} \begin{exercise}[Crackme]{2}
Die Funkion \lstinline{verify_key} leitet das Passwort aus einem geheimen Schlüssel ab, indem der ASCII-Wert jedes Zeichens, abhängig von dessen Position, verändert wird. Die Funktion \lstinline{verify_key} leitet das Passwort aus einem geheimen Schlüssel ab, indem der ASCII-Wert jedes Zeichens, abhängig von dessen Position, verändert wird.
Dem ASCII-Wert jedes Zeichens wird der doppelte Positionswert, bei 0 startend, abgezogen. Dem ASCII-Wert jedes Zeichens wird der doppelte Positionswert, bei 0 startend, abgezogen.
Die Funktion gibt den Wert \lstinline{1} zurück, falls das abgeleitete Passwort mit der konstanten Zeichenkette \lstinline{MMNNQ} übereinstimmt. Die Funktion gibt den Wert \lstinline{1} zurück, falls das abgeleitete Passwort mit der konstanten Zeichenkette \lstinline{MMNNQ} übereinstimmt.
@ -257,11 +258,85 @@ Key to Flags:
\begin{exercise}[System Calls und Shellcode]{3} \begin{exercise}[System Calls und Shellcode]{3}
\begin{subexercises} \begin{subexercises}
\item Ein Linux-Syscall auf der x86-Architektur ist als i386-Architektur in \lstinline{syscall(2)} der Linux Manpages spezifiziert. \item Ein Linux-Syscall auf der x86-Architektur ist als i386-Architektur in \lstinline{syscall(2)} der Linux Manpages spezifiziert.
oohhh
Dabei wird die Zahlenkennung des Syscalls in Register eax übergeben. Dabei wird die Zahlenkennung des Syscalls in Register eax übergeben.
Bis zu 6 Argumente können in den Registern \lstinline{ebx}, \lstinline{ecx}, \lstinline{edx}, \lstinline{esi}, \lstinline{edi} und \lstinline{ebp} übergeben werden. Bis zu 6 Argumente können in den Registern \lstinline{ebx}, \lstinline{ecx}, \lstinline{edx}, \lstinline{esi}, \lstinline{edi} und \lstinline{ebp} übergeben werden.
Mit dem Aufruf der Instruktion \lstinline{int $0x80} wird der Syscall ausgelöst und der Syscall-Handler im Kernel durch Auslösen eines Interrupts ausgeführt. Mit dem Aufruf der Instruktion \lstinline{int $0x80} wird der Syscall ausgelöst und der Syscall-Handler im Kernel durch Auslösen eines Interrupts ausgeführt.
Ausgaben des Syscalls werden in den Registern eax und edx zurückgegeben. Ausgaben des Syscalls werden in den Registern eax und edx zurückgegeben.
\end{subexercises} \end{subexercises}
\end{exercise} \end{exercise}
\lstset{
language=C,
basicstyle=\ttfamily\footnotesize,
keywordstyle=\color{blue},
commentstyle=\color{gray},
stringstyle=\color{red},
numbers=left,
numberstyle=\tiny\color{gray},
stepnumber=1,
numbersep=5pt,
backgroundcolor=\color{white},
showspaces=false,
showstringspaces=false,
showtabs=false,
frame=single,
tabsize=4,
captionpos=b,
breaklines=true,
breakatwhitespace=false,
escapeinside={\%*}{*)},
morekeywords={uint32_t, uint16_t, uint8_t} % Add keywords here
}
\begin{exercise}[Data-Only Attack]{4}
\begin{subexercises}
\item Im folgenden einmal die ursprüngliche und die gehärtete Funktion.
\begin{lstlisting}[caption={check\_authentication}, label={lst:check_authentication}]
int check_authentication(char *password) {
int auth_flag = 0;
char password_buffer[12];
strcpy (password_buffer, password);
if(strcmp(password_buffer, "swordfish") == 0)
auth_flag = 1;
return auth_flag;
}
\end{lstlisting}
\begin{lstlisting}[caption={hardened check\_authentication}, label={lst:hardened_check_authentication}]
int check_authentication(char *password) {
char x = 0, y = 0, z = 0;
char password_buffer[12];
strcpy(password_buffer, password);
if(strcmp(password_buffer, "swordfish") == 0) {
x = 0x21;
y = 0x6b;
z = 0x4f;
}
int auth_flag = 0;
if((x == 0x21) && (y == 0x6b) && (z == 4f)) {
auth_flag = 1;
}
return auth_flag;
}
\end{lstlisting}
Die gehärtete Funktion deklariert \texttt{auth\_flag} nicht mehr als Erstes innerhalb der Funktion. Stattdessen werden zunächst drei Variablen vom Typ \texttt{char} mit dem Wert 0 initialisiert. In der IF-Abfrage, in der das Passwort mit dem String \texttt{swordfish} verglichen wird, wird bei übereinstimmendem Passwort nicht mehr direkt \texttt{auth\_flag} auf 1 gesetzt. Stattdessen erhalten die drei zuvor deklarierten Variablen spezifische Werte. Anschließend wird \texttt{auth\_flag} mit 0 initialisiert. In einer zweiten IF-Abfrage wird überprüft, ob die drei Variablen die Werte aufweisen, die sie bei korrektem Passwort haben sollten. Falls dies der Fall ist, wird \texttt{auth\_flag} auf 1 gesetzt. Zum Abschluss wird \texttt{auth\_flag} zurückgegeben. Die nicht gehärtete Funktion, setzt direkt nach dem Vergleich den Rückgabewert, falls das Passwort korrekt ist, auf 1. Danach wird dieser zurückgegeben.
Da die 3 Variablen vor dem \texttt{password\_buffer} deklariert werden, liegen sie an einer höheren Speicheradresse im Stack. Somit überschreibt, falls der Input \texttt{char *password} einen String länger als 12 Byte enthält, die unsichere Funktion \texttt{strcpy} diese drei Variablen. Somit muss das Passwort 15 Byte lange sein (12 Byte Buffer + 3 Bytes). Die ersten zwölf Byte sorgen dafür, dass das 13. Byte die erste der drei Variablen überschreibt, etc. Somit müssen die 3 letzten Byte die Werte haben, auf die in der 2. IF-Abfrage geprüft wird, damit die \texttt{auth\_flag} auf 1 gesetzt wird. Diese können mit einem Debugger einfach gefunden werden.
\item Anbei das ausgefüllte Speicherlayout. Anbei Bilder, die unser ausgefülltes Layout bestätigen.
\includegraphics[width=\textwidth]{gdb.png}
\includepdf[pages=1]{h5_ss24.pdf}
\end{subexercises}
\end{exercise}
\end{document} \end{document}

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 KiB

Binary file not shown.