% vim : tabstop 4 %%%%%%%%%%%%%%%%%%%% % seguridad.tex - Transparencias de la sección de Seguridad del Curso de C % Guillermo Ramos Gutiérrez %%%%%%%%%%%%%%%%%%%%% \documentclass{beamer} \mode { \usetheme{ACM} \setbeamercovered{transparent} } \usepackage[spanish]{babel} \usepackage[utf8]{inputenc} \usepackage{times} \usepackage{color} \title[Curso de C: Seguridad] {Curso de C: Seguridad} \author[Guillermo Ramos] { Guillermo Ramos \\ \texttt{wille@acm.asoc.fi.upm.es} } \institute[ACM FI - UPM] { ACM Facultad de Informática \\ Universidad Politécnica de Madrid } \date{24 de marzo de 2011} \pgfdeclareimage[height=0.7cm]{acm-logo}{acm} \logo{\pgfuseimage{acm-logo}} \AtBeginSection[] { \begin{frame} \frametitle{Contenido} \tableofcontents[currentsection] \end{frame} } \begin{document} \begin{frame} \titlepage \end{frame} \begin{frame}{Contenido} \tableofcontents \end{frame} \section{¿De qué va todo esto?} \begin{frame}{} \begin{center} \textbf{\huge 01010000} \end{center} \end{frame} \begin{frame}{} \begin{center} \textbf{\huge 01010001} \\ \vspace{1cm} \uncover<1>{¿0x50?} \\ \uncover<2>{¿push eax?} \\ \uncover<3>{¿true?} \end{center} \end{frame} \begin{frame}{} \begin{center} \textbf{\huge 01010000} \\ \vspace{1cm} $\surd$ 0x50 \\ $\surd$ push eax \\ $\surd$ true \end{center} \end{frame} \begin{frame}{} \begin{center} \includegraphics[width=3cm]{img/dudewtf.png} \end{center} \end{frame} \begin{frame}{En resumen} \begin{itemize} \item Problema: \textbf{distinguir datos de código} \item La información no tiene más significado que el que le da un proceso. \item Esto se suele aprovechar para controlar los fallos de software y modificar el flujo de ejecución. \end{itemize} \end{frame} \section{Memoria} \subsection{Memoria Virtual} \begin{frame}{Memoria Virtual} \begin{center} \includegraphics[width=6cm]{img/memoria_virtual.png} \end{center} \end{frame} \subsection{Organización de memoria} \begin{frame}{Organización de memoria} \begin{center} \includegraphics[width=6cm]{img/memory_org.png} \end{center} \end{frame} \begin{frame}{Ejemplo} \begin{center} \begin{block}{ejemplounopuntocé.c} char global; \\ float pi = 3.14; \\[3mm] int main() \{ \\ \hspace{1cm}int local; \\ \hspace{1cm}char* buffer = (char*)malloc(20); \\ \hspace{1cm}return 0; \\ \} \end{block} \end{center} \end{frame} \begin{frame}{Ejemplo} \begin{center} \begin{block}{ejemplounopuntocé.c} char global; \textcolor{red}{// bss} \\ float pi = 3.14; \textcolor{red}{// data} \\[3mm] int main() \{ \textcolor{red}{// code} \\ \hspace{1cm}int local; \textcolor{red}{// stack} \\ \hspace{1cm}char* buffer = (char*)malloc(20); \textcolor{red}{// heap (*buffer)} \\ \hspace{1cm}return 0; \\ \} \end{block} \end{center} \end{frame} \subsection{La pila} \begin{frame}{La pila} Guarda el estado de las funciones en \textbf{marcos de pila} \\ Cada marco de pila almacena: \begin{itemize} \item Parámetros \item Variables locales \item Dirección de retorno de la función \end{itemize} \end{frame} \begin{frame}{El marco de pila} \begin{center} \includegraphics[width=6cm]{img/stack_frame_struct.png} \end{center} \end{frame} \begin{frame}{La pila} \begin{center} \includegraphics[width=6cm]{img/stack_call_struct.png} \end{center} \end{frame} \begin{frame}{Ejemplos} \begin{center} \includegraphics[width=6cm]{img/showmethecode.png} \end{center} \end{frame} \section{Buffer Overflows} \begin{frame}{Introducción} \begin{center} \textit{At first I was like...} \\[3mm] \includegraphics[width=8cm]{img/bof1.png} \end{center} \end{frame} \begin{frame}{Introducción} \begin{center} \textit{... but then I was like...} \\[3mm] \includegraphics[width=7cm]{img/nuclear_explosion.png} \end{center} \end{frame} \begin{frame}{Introducción} \begin{center} Un buffer overflow ocurre cuando no se controla la cantidad de datos que se pueden copiar en un buffer y se sigue escribiendo tras haberlo rellenado, provocando la sobreescritura de la memoria adyacente a él. \\[3mm] \includegraphics[width=6cm]{img/bof2.png} \end{center} \end{frame} \begin{frame}{Introducción} \begin{center} \includegraphics[width=8cm]{img/stack_overflow_1.png} \end{center} \end{frame} \begin{frame}{Introducción} \begin{center} \includegraphics[width=8cm]{img/stack_overflow_2.png} \end{center} \end{frame} \begin{frame}{Introducción} \begin{center} \includegraphics[width=8cm]{img/stack_overflow.png} \end{center} \end{frame} \begin{frame}{Ejemplos} \begin{center} \includegraphics[width=6cm]{img/showmethecode.png} \end{center} \end{frame} \section{Format Strings} \begin{frame}{Introducción} \begin{center} \begin{block}{ejemplodospuntocé.c} int main(int argc, char** argv) \{ \\ \hspace{1cm}if (argc $>$ 1) \\ \hspace{2cm}printf(argv[1]); \\ \hspace{1cm}return 0; \\ \} \end{block} \begin{block}{ejemplotrespuntocé.c} int main(int argc, char** argv) \{ \\ \hspace{1cm}if (argc $>$ 1) \\ \hspace{2cm}printf("\%s", argv[1]); \\ \hspace{1cm}return 0; \\ \} \end{block} \end{center} \end{frame} \begin{frame}{\%x\%x\%x\%x\%x\%x\%x\%x\%x\%x\%x\%x\%x\%x\%x\%x\%x} \begin{center} Un ataque de format strings es una inyección de caracteres que hace que printf() o cualquier derivado interprete que debe insertar parámetros en la salida. Al no haberlos, usa memoria de la pila. \end{center} \end{frame} \begin{frame}{Ejemplos} \begin{center} \includegraphics[width=6cm]{img/showmethecode.png} \end{center} \end{frame} \section{} \begin{frame}{} \begin{center} ¿Dudas, preguntas? \\ \includegraphics[width=5cm]{img/dudas.jpg} \end{center} \end{frame} \begin{frame}{} \textbf{Bibliografía recomendada:} \begin{thebibliography}{99} \bibitem{} \htmladdnormallink{Erickson, J. (2008). \textit{The Art of Exploitation, 2nd Edition}}{http://www.amazon.com/Hacking-Art-Exploitation-Jon-Erickson/dp/1593271441/} \bibitem{} \htmladdnormallink{Anley, C., Heasman, J., Lindner, F., Richarte, G. (2007). \textit{The Shellcoder's Handbook: Discovering and Exploiting Security Holes}}{http://www.amazon.com/Shellcoders-Handbook-Discovering-Exploiting-Security/dp/047008023X/} \end{thebibliography} \end{frame} \begin{frame}{} \begin{center} \textbf{¡Gracias por venir!} \end{center} \end{frame} \end{document}