Assignment-5 #2

Merged
saschato merged 18 commits from Assignment-5 into master 2024-06-10 14:32:32 +02:00
4 changed files with 79 additions and 8 deletions
Showing only changes of commit c8eef2fc34 - Show all commits

View file

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

View file

@ -12,6 +12,7 @@
\usepackage{algpseudocode}
\usepackage{xifthen}
\usepackage{xcolor}
\usepackage{pdfpages}
\usepackage[a4paper,lmargin={2cm},rmargin={2cm},tmargin={2.5cm},bmargin = {2.5cm},headheight = {4cm}]{geometry}
\usepackage{amsmath,amssymb,amstext,amsthm}
\usepackage[shortlabels]{enumitem}
@ -234,7 +235,7 @@ Key to Flags:
p (processor specific)
\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>:]
\item .bss
\item .data
@ -247,7 +248,7 @@ Key to Flags:
\end{exercise}
\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.
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{subexercises}
\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.
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.
Ausgaben des Syscalls werden in den Registern eax und edx zurückgegeben.
\end{subexercises}
\end{exercise}
\end{document}
\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}

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 KiB

Binary file not shown.