Assignment-5 #2
4 changed files with 79 additions and 8 deletions
|
@ -1,4 +0,0 @@
|
||||||
# Latex Outputs
|
|
||||||
*.log
|
|
||||||
*.synctex.gz
|
|
||||||
*.pdf
|
|
|
@ -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}
|
||||||
\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}
|
BIN
Assignment 5 - Software Security - Teil 1/gdb.png
Normal file
BIN
Assignment 5 - Software Security - Teil 1/gdb.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 291 KiB |
BIN
Assignment 5 - Software Security - Teil 1/h5_ss24.pdf
Normal file
BIN
Assignment 5 - Software Security - Teil 1/h5_ss24.pdf
Normal file
Binary file not shown.
Loading…
Reference in a new issue