diff --git a/Assignment 5 - Software Security - Teil 1/.gitignore b/Assignment 5 - Software Security - Teil 1/.gitignore deleted file mode 100644 index a191adf..0000000 --- a/Assignment 5 - Software Security - Teil 1/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Latex Outputs -*.log -*.synctex.gz -*.pdf \ No newline at end of file diff --git a/Assignment 5 - Software Security - Teil 1/abgabe.tex b/Assignment 5 - Software Security - Teil 1/abgabe.tex index 8b8462b..36c563e 100644 --- a/Assignment 5 - Software Security - Teil 1/abgabe.tex +++ b/Assignment 5 - Software Security - Teil 1/abgabe.tex @@ -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}[:] \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} \ No newline at end of file diff --git a/Assignment 5 - Software Security - Teil 1/gdb.png b/Assignment 5 - Software Security - Teil 1/gdb.png new file mode 100644 index 0000000..c56078b Binary files /dev/null and b/Assignment 5 - Software Security - Teil 1/gdb.png differ diff --git a/Assignment 5 - Software Security - Teil 1/h5_ss24.pdf b/Assignment 5 - Software Security - Teil 1/h5_ss24.pdf new file mode 100644 index 0000000..d659a55 Binary files /dev/null and b/Assignment 5 - Software Security - Teil 1/h5_ss24.pdf differ