\documentclass[aspectratio=169,16pt]{beamer}

\usetheme[department=FakIM,pageNumbers]{OTHR}

% document language and hyphenation
\usepackage[ngerman]{babel}
% \usepackage[utf8]{luainputenc}
% \usepackage{filecontents}
\usepackage{subfigure}

% code listings
\usepackage{listings}
\usepackage{minted}

\usepackage{enumerate}
\usepackage{calc}

\usepackage[plain]{fancyref}

% math stuff
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{mathtools}

\usepackage{chronology}

\usepackage[backend=biber,style=alphabetic]{biblatex}
\addbibresource{bibliography.bib}
% \bibliographystyle{amsalpha}

% acronyms
\usepackage{acro}
% \acsetup{single,make-links=true}
\acsetup{make-links=true}
\input{acronyms}

% custom commands
\input{commands}

\graphicspath{{assets/}}

\useDepartmentLogo

\AtBeginSubsection[]
{%
  \begin{frame}
    \frametitle{Inhalt}
    \tableofcontents[
      currentsection,
      hideothersubsections,
      sectionstyle=show/hide,
      subsectionstyle=show/shaded/hide,
    ]
  \end{frame}
  \addtocounter{framenumber}{-1}% If you don't want them to affect the slide number
}

\begin{document}
\newcommand{\genemail}[1]{\href{mailto:#1}{\textless\nolinkurl{#1}\textgreater}}
\title{Buffer Overflows}
\author[Valentin~Brandl]{Valentin Brandl~\genemail{mail@vbrandl.net}}
\institute{Fakultät Informatik und Mathematik}
\date{\today}

% Angepasstes Titelformat definieren (verwendet bewusst nicht die
% Beamer-Infrastruktur, um einfache Anpassungen zu zeigen)
\newcommand{\fillme}{\vskip0pt plus 1filll}
\newenvironment{references}{\begin{tiny}\begin{flushleft}}%
    {\end{flushleft}\end{tiny}\vspace*{\fill}}
\defbeamertemplate*{title page}{customized}[1][]
{
  \vspace*{1em}\usebeamerfont{title}\textbf{\inserttitle}\bigskip\par

  \begin{scriptsize}
  \insertauthor\bigskip\par
  \textit{\insertinstitute}\\\insertdate
  \end{scriptsize}

  % \fillme\begin{references}
  %   \(^{1}\){\color{gray}{GPG/PGP-ID \href{http://pgp.mit.edu/pks/lookup?op=vindex&search=0xD22BCBB9E835336F}{E835336F},
  %   Fingerprint: A62E FFFC 4029 7339 357B  D04D D22B CBB9 E835 336F.}}\\
  %  \(^{2}\){\color{gray}{GPG/PGP-ID \href{http://keys.gnupg.net/pks/lookup?op=get&search=0xF16F252398356E1E}{98356E1E},
  %   Fingerprint: 5920 9407 AB5C 8B28 3C7B 4F02 F16F 2523 9835 6E1E.}}
  % \end{references}
}

\maketitle

\frame{%
  \frametitle{Inhalt}
  \tableofcontents[
    sectionstyle=show/show,
    subsectionstyle=hide/hide,
  ]
}

\section{Problem}
\begin{frame}
\frametitle{Problem}
\begin{itemize}
  \item Maschinennahe Programmiersprachen ohne Memorysafety (z.B. C, C++, Assembly, FORTRAN) erlauben es, Speicher beliebig zu beschreiben (\mintinline{c}{arr[i] == arr + sizeof(int) * i})

  \item Bei fehlender Validierung kann ein Programm mehr Speicher schreiben, als eigentlich reserviert wurde und dabei andere Daten im RAM überschreiben

  \item Entsprechend präparierter Input kann dazu führen, dass ein Angreifer den Ablauf der Programmausführung übernehmen kann
\end{itemize}
\end{frame}

\section{Beispiel}
\begin{frame}
  \inputminted[firstline=4,lastline=13]{c}{assets/logic/logic.c}
\end{frame}

% \begin{frame}
%   \inputminted[firstline=3,lastline=7]{c}{assets/vuln.c}
% \end{frame}

\section{Stack Layout, Execution Flow}
\begin{frame}
\frametitle{Stack Layout}
\includegraphics[width=.30\textwidth]{stack.png}
\end{frame}

\begin{frame}
\frametitle{Stack Layout}
\includegraphics[width=.60\textwidth]{stack_overflow.png}
\end{frame}

\begin{frame}
\frametitle{Execution Flow}
\begin{itemize}
  \item Beim Aufruf einer Funktion, aktuelle Adresse auf Stack
  \item \emph{\Ac{ip}} auf Adresse der aufgerufenen Funktion
  \item Bei \mintinline{c}{return}, Stack Frame wiederherstellen, Adresse von Stack in \emph{\Ac{ip}}
  \item Was wenn die Adresse auf dem Stack überschrieben wurde?
\end{itemize}
\end{frame}

\section{Exkurs: Shellcode}
\begin{frame}
  \begin{itemize}
    \item Shellcode ist der Maschinencode, der nach Übernahme des Ausführungsablauf ausgeführt werden soll
    \item Buffer kann klein sein \(\Rightarrow\) Shellcode häufig auf Größe optimiert
    \item Häufig Strings als Eingabe
    \item In C terminiert mit \mintinline{c}{\0} \(\Rightarrow\) Payload darf kein \mintinline{c}{0x00} enthalten, da alles danach abgeschnitten wird
    \item \(\Rightarrow\) Selbst schreiben ist möglich, aber aufwändig und setzt Kenntnisse in Assembly und der anzugreifenden Architektur/OS/... voraus
    \item Verfügbare, öffentliche Sammlungen verwenden:
      \begin{itemize}
        \item \url{https://shell-storm.org/shellcode/}
        \item \url{https://www.exploit-db.com/shellcodes}
      \end{itemize}
  \end{itemize}
% \frametitle{Exkurs: Shellcode}
\end{frame}

\section{Exploitation}
\begin{frame}
\frametitle{Code Execution}
\begin{itemize}
  \item Shellcode im Speicher plazieren
  \item Buffer überschreiben
  \item \emph{\Ac{ip}} überschreiben
  \item \emph{\Ac{ip}} auf Shellcode zeigen lassen
\end{itemize}
\end{frame}

\section{Aktuelles Beispiel}
\begin{frame}
\frametitle{Beispiel in freier Wildbahn}
\begin{description}
  \item[\emph{Chromium}] Heap Buffer Overflown WebGPU: \emph{CVE-2022-1483}
  \item[\emph{Linux Kernel}] Heap Buffer Overflow durch Integer Overflow: \emph{CVE-2022-39842}
  \item[\emph{MPlayer}] Buffer Overflow beim lesen von AVI und MPEG Headern: \emph{CVE-2022-38866}, \emph{CVE-2022-38864}
  \item[\emph{GNU Binutils}] Heap Buffer Overflow in \emph{strip}: \emph{CVE-2022-38533}
\end{description}
\end{frame}

\section{Aktuelle Situation}
\begin{frame}
\frametitle{Migrationen}
  \begin{itemize}
    \item \Ac{aslr}
    \item \emph{w\^{}x} Memory
    \item Runtime Bounds Checks
    \item Typesystem basierte Lösungen~\cite{Dep2007}
  \end{itemize}
\end{frame}


\appendix
% \nocite{*}
\section*{Quellen}
% \begin{frame}[allowframebreaks,nosection]
\begin{frame}[noframenumbering,plain,allowframebreaks]
  \frametitle{Quellen}

  \printbibliography[heading=none]{}
\end{frame}

\end{document}
%  vim: set filetype=tex ts=2 sw=2 tw=0 et spell :
