<?xml version="1.0" encoding="ISO-8859-1"?><article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<front>
<journal-meta>
<journal-id>1692-3324</journal-id>
<journal-title><![CDATA[Revista Ingenierías Universidad de Medellín]]></journal-title>
<abbrev-journal-title><![CDATA[Rev. ing. univ. Medellín]]></abbrev-journal-title>
<issn>1692-3324</issn>
<publisher>
<publisher-name><![CDATA[Universidad de Medellín]]></publisher-name>
</publisher>
</journal-meta>
<article-meta>
<article-id>S1692-33242011000200014</article-id>
<title-group>
<article-title xml:lang="es"><![CDATA[TÉCNICAS DE OFENSA Y DEFENSA A LOS FALLOS POR CORRUPCIÓN DE MEMORIA]]></article-title>
<article-title xml:lang="en"><![CDATA[Memory Corruption Failures Attack and Defense Techniques]]></article-title>
</title-group>
<contrib-group>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Mora Rodríguez]]></surname>
<given-names><![CDATA[David]]></given-names>
</name>
<xref ref-type="aff" rid="A01"/>
</contrib>
<contrib contrib-type="author">
<name>
<surname><![CDATA[Muñoz]]></surname>
<given-names><![CDATA[Mario]]></given-names>
</name>
<xref ref-type="aff" rid="A02"/>
</contrib>
</contrib-group>
<aff id="A01">
<institution><![CDATA[,Universidad de Antioquia  ]]></institution>
<addr-line><![CDATA[ ]]></addr-line>
</aff>
<aff id="A02">
<institution><![CDATA[,Universidad de Antioquia  ]]></institution>
<addr-line><![CDATA[ ]]></addr-line>
</aff>
<pub-date pub-type="pub">
<day>00</day>
<month>12</month>
<year>2011</year>
</pub-date>
<pub-date pub-type="epub">
<day>00</day>
<month>12</month>
<year>2011</year>
</pub-date>
<volume>10</volume>
<numero>19</numero>
<fpage>149</fpage>
<lpage>158</lpage>
<copyright-statement/>
<copyright-year/>
<self-uri xlink:href="http://www.scielo.org.co/scielo.php?script=sci_arttext&amp;pid=S1692-33242011000200014&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://www.scielo.org.co/scielo.php?script=sci_abstract&amp;pid=S1692-33242011000200014&amp;lng=en&amp;nrm=iso"></self-uri><self-uri xlink:href="http://www.scielo.org.co/scielo.php?script=sci_pdf&amp;pid=S1692-33242011000200014&amp;lng=en&amp;nrm=iso"></self-uri><abstract abstract-type="short" xml:lang="es"><p><![CDATA[Las técnicas de ataque a aplicaciones por corrupción de memoria aprovechan las debilidades de los programas para obtener ejecución de código arbitrario. Estos fallos de programación han sido utilizados por diferentes ataques desde la década de los ochenta. Este documento presenta las diferentes técnicas que puede utilizar un atacante para lograr su objetivo y las precauciones que debe tener un desarrollador de aplicaciones, para evitar que su programa esté expuesto a vulnerabilidades que permitan ejecutar ataques por corrupción de memoria. Los fabricantes de sistemas operativos y compiladores introdujeron diferentes mecanismos de defensa para proteger las aplicaciones. Estos mecanismos no son excluyentes y cada uno tiene sus propios objetivos de diseño para añadir nuevas capas de seguridad.]]></p></abstract>
<abstract abstract-type="short" xml:lang="en"><p><![CDATA[Attack techniques against memory corruption applications take advantage of the programs weakness for obtaining execution of arbitrary code. These programming failures have been used for several attacks since the 80's. This document shows several techniques to be used by an attacker in order to achieve his objectives and the precautions an application developer should have for preventing the program to be exposed vulnerable situations which may allow having attacks for memory corruption. Manufacturers of operating systems and compilers introduced several defense mechanisms to protect applications. These are not excluding mechanisms and each one of them has its own design objectives for adding new security layers.]]></p></abstract>
<kwd-group>
<kwd lng="es"><![CDATA[ASLR]]></kwd>
<kwd lng="es"><![CDATA[Corrupción de memoria]]></kwd>
<kwd lng="es"><![CDATA[NX/XD]]></kwd>
<kwd lng="es"><![CDATA[Sistemas operativos]]></kwd>
<kwd lng="es"><![CDATA[Programación orientada a retornos]]></kwd>
<kwd lng="en"><![CDATA[ASLR]]></kwd>
<kwd lng="en"><![CDATA[memory corruption]]></kwd>
<kwd lng="en"><![CDATA[NX/XD]]></kwd>
<kwd lng="en"><![CDATA[operating systems;]]></kwd>
<kwd lng="en"><![CDATA[return-oriented programming]]></kwd>
</kwd-group>
</article-meta>
</front><body><![CDATA[  	    <p align="right"><FONT SIZE="2" FACE="Verdana"><B> ART&Iacute;CULOS</B></FONT></p> 	    <p align="right">&nbsp;</p>     <p ALIGN="CENTER"><FONT SIZE="4" FACE="Verdana"><B> T&Eacute;CNICAS DE OFENSA Y DEFENSA A LOS FALLOS POR CORRUPCI&Oacute;N DE MEMORIA	 </B></FONT></p>     <p ALIGN="CENTER">&nbsp;</p>     <p ALIGN="CENTER"><B><FONT SIZE="3" FACE="Verdana">Memory Corruption Failures Attack and Defense Techniques  </FONT></B></p>     <p>&nbsp;</p>     <p align="center"><FONT SIZE="2" FACE="Verdana"> <b>David Mora Rodr&iacute;guez<SUP>*</SUP>; Mario Mu&ntilde;oz<SUP>**</SUP> </b></FONT></p>     <p align="center">&nbsp;</p>     <p><FONT SIZE="2" FACE="Verdana"> <SUP>* </SUP>Mg. Seguridad de la Informaci&oacute;n (Universitat Oberta de Catalunya), Estudiante de Maestr&iacute;a en Ingenier&iacute;a (Universidad de Antioquia), Direcci&oacute;n Calle 67 N&uacute;mero 53-108, Tel&eacute;fono 2195560, <a href="mailto:dmora@udea.edu.co">dmora@udea.edu.co</a></FONT></p>     ]]></body>
<body><![CDATA[<p><FONT SIZE="2" FACE="Verdana"> <SUP>**</SUP> M. Sc. Ingenier&iacute;a El&eacute;ctrica (Universidade de Sao Paulo, Brasil), aspirante a doctorado (Universidade de Sao Paulo, Brasil), profesor en Ingenier&iacute;a Electr&oacute;nica (Universidad de Antioquia), Tel&eacute;fono 2198565, <a href="mailto:mamunoz@udea.edu.co">mamunoz@udea.edu.co</a></FONT></p>     <p>&nbsp;</p>     <p><FONT SIZE="2" FACE="Verdana"><B>Recibido: </B>18/11/2010    <br> <B>Aceptado:</B> 19/10/2011 </FONT></p>     <p>&nbsp;</p> <hr size="1" noshade>     <p><FONT SIZE="2" FACE="Verdana"><B>RESUMEN </B></FONT></p>     <p><FONT SIZE="2" FACE="Verdana">Las t&eacute;cnicas de ataque a aplicaciones por corrupci&oacute;n de memoria aprovechan las debilidades de los programas para obtener ejecuci&oacute;n de c&oacute;digo arbitrario. Estos fallos de programaci&oacute;n han sido utilizados por diferentes ataques desde la d&eacute;cada de los ochenta. Este documento presenta las diferentes t&eacute;cnicas que puede utilizar un atacante para lograr su objetivo y las precauciones que debe tener un desarrollador de aplicaciones, para evitar que su programa est&eacute; expuesto a vulnerabilidades que permitan ejecutar ataques por corrupci&oacute;n de memoria. Los fabricantes de sistemas operativos y compiladores introdujeron diferentes mecanismos de defensa para proteger las aplicaciones. Estos mecanismos no son excluyentes y cada uno tiene sus propios objetivos de dise&ntilde;o para a&ntilde;adir nuevas capas de seguridad.</FONT></p>     <p><FONT SIZE="2" FACE="Verdana"><B>Palabras clave: </B>ASLR, Corrupci&oacute;n de memoria, NX/XD, Sistemas operativos, Programaci&oacute;n orientada a retornos </FONT></p> <hr size="1" noshade>     <P><font size="2" face="Verdana"><B>Abstract  </B></font></P>     <p><FONT SIZE="2" FACE="Verdana"> Attack techniques against memory corruption applications take advantage of the programs weakness for obtaining execution of arbitrary code. These programming failures have been used for several attacks since the 80's. This document shows several techniques to be used by an attacker in order to achieve his objectives and the precautions an application developer should have for preventing the program to be exposed vulnerable situations which may allow having attacks for memory corruption. Manufacturers of operating systems and compilers introduced several defense mechanisms to protect applications. These are not excluding mechanisms and each one of them has its own design objectives for adding new security layers.</FONT></p>     ]]></body>
<body><![CDATA[<p><FONT SIZE="2" FACE="Verdana"><B>Key words:</B> ASLR; memory corruption; NX/XD; operating systems; return-oriented programming. </FONT></p> <hr size="1" noshade>     <p>&nbsp;</p>     <p>&nbsp;</p>     <p><FONT SIZE="3" FACE="Verdana"><B>INTRODUCCI&Oacute;N  </B></FONT></p>     <p><FONT SIZE="2" FACE="Verdana">La corrupci&oacute;n de memoria no es un problema reciente. En &#91;1] se hace referencia a un informe desarrollado por la fuerza a&eacute;rea de los Estados Unidos en 1972. El reporte indicaba que fabricando adecuadamente las entradas de usuario era posible manipular los apuntadores para producir una fuga de informaci&oacute;n. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Posteriormente, en 1988, se liber&oacute; el gusano ''Morris-Worm'' (primer programa de autopropagaci&oacute;n liberado en Internet). Este programa introdujo lo que hoy se conoce como ataques por corrupci&oacute;n de memoria y el c&oacute;digo malicioso de autopropagaci&oacute;n. Este documento pretende explicar las diferentes t&eacute;cnicas de ataque a aplicaciones, los mecanismos de seguridad vigentes y la forma en que un atacante puede evadirlos. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> La primera parte de este documento presenta las t&eacute;cnicas de ataque que han demostrado ser efectivas. Posteriormente, se presenta una generalizaci&oacute;n de las t&eacute;cnicas que permiten determinar el impacto de un fallo de programaci&oacute;n con respecto a la posibilidad de obtener ejecuci&oacute;n de c&oacute;digo arbitrario. Tambi&eacute;n se presenta una explicaci&oacute;n sobre el motivo de estas vulnerabilidades y las acciones que se pueden tomar para disminuir el riesgo que representan estos fallos. Finalmente, se exponen las tendencias de los ataques modernos para evadir las estrategias de protecci&oacute;n en los sistemas actuales. </FONT></p>     <p>&nbsp;</p>     <p><FONT SIZE="3" FACE="Verdana"><B>1. ATAQUES CL&Aacute;SICOS POR CORRUPCI&Oacute;N DE MEMORIA  </B></FONT></p>     <p><FONT SIZE="2" FACE="Verdana">Los ataques por corrupci&oacute;n de memoria permiten manipular la memoria del programa vulnerable para forzar a la aplicaci&oacute;n a comportarse de manera diferente a la que fue programada. Esta secci&oacute;n presenta tres tipos de ataques: desbordamiento de <I>buffer</I> en la pila &#91;2], cadenas de formato &#91;3], y desbordamiento de <I>buffer</I> en el mont&iacute;culo (del t&eacute;rmino en ingl&eacute;s ''<I>heap</I>'') &#91;4]. </FONT></p>     ]]></body>
<body><![CDATA[<p><FONT SIZE="2" FACE="Verdana"><B>1.1 Desbordamiento de buffer en la pila	 </B></FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> En 1996, Levy public&oacute; una explicaci&oacute;n detallada sobre la t&eacute;cnica de desbordamiento de <I>buffer </I>&#91;2]. El documento gener&oacute; tal impacto que a&uacute;n hoy contin&uacute;a siendo un marco de referencia para otros autores &#91;1, 5, 6]. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Los programas de usuario utilizan una regi&oacute;n de memoria llamada la pila, donde se almacena informaci&oacute;n relacionada con el flujo de ejecuci&oacute;n del proceso. Dicha informaci&oacute;n est&aacute; compuesta por datos locales a funciones, direcciones de retorno y apuntadores relativos para la direcci&oacute;n de datos (tambi&eacute;n conocidos como apuntadores del marco de la pila). </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> En las arquitecturas x86 y AMD64, se han reservado dos registros para controlar el funcionamiento de la pila. El primero de estos registros se conoce como el apuntador de la pila <I>ESP</I> (del ingl&eacute;s, <I>stack pointer</I>) y es el responsable de mantener la referencia al final de la pila; el segundo es el apuntador del marco de pila, gobernado por el registro <I>EBP</I> (del ingl&eacute;s, <I>base pointer</I>). </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> En la <a href="#f1">figura 1</a>, se muestra un esquema para representar el espacio virtual de direcciones de los procesos en los sistemas Linux. Como puede observarse, el apuntador de pila suele ubicarse al final del espacio de memoria de usuario y el espacio de pila ''crece'' hacia las direcciones bajas donde residen el mont&iacute;culo, los datos globales y el c&oacute;digo. </FONT></p>     <p>&nbsp;</p>     <p align="center"><a name="f1"></a><img src="/img/revistas/rium/v10n19/v10n19a14f1.jpg"></p>     <p align="center">&nbsp;</p>     <p><FONT SIZE="2" FACE="Verdana"> Los datos en la pila utilizan direccionamiento relativo. El C&Oacute;DIGO 1 es un ejemplo de la salida de un compilador para un programa escrito en C que defina dos funciones, main y primera_funcion. Las instrucciones 1 y 2 de C&Oacute;DIGO 1 son conocidas como el preludio y su prop&oacute;sito es configurar un nuevo marco de pila para ofrecer la capacidad de direccionamiento relativo en los datos locales. El uso del direccionamiento relativo puede observarse en la instrucci&oacute;n 5 de C&Oacute;DIGO 1, donde se almacena el valor 0x01 (byte) en una ubicaci&oacute;n 256 bytes adelante del EBP. La instrucci&oacute;n 4 de <a href="#f2">C&Oacute;DIGO 1</a> se encarga de reservar memoria en el interior de la pila. </FONT></p>     <p>&nbsp;</p>     ]]></body>
<body><![CDATA[<p align="center"><a name="f2"></a><img src="/img/revistas/rium/v10n19/v10n19a14f2.jpg"></p>     <p align="center">&nbsp;</p>     <p><FONT SIZE="2" FACE="Verdana"> El otro segmento de c&oacute;digo similar en las dos funciones es la forma en que finalizan y se puede observar en las instrucciones 7,8 y 17,18. La responsabilidad de recuperar la pila depende de la convenci&oacute;n utilizada para llamar una funci&oacute;n. A. Fog en &#91;7] presenta diferentes convenciones para el llamado a funciones. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> El uso de la pila para almacenar datos locales genera una debilidad importante: el hecho de almacenar los datos de usuario contiguos a los datos de control de la pila, permite que un error de programaci&oacute;n sobrescriba la informaci&oacute;n de control con datos de usuario. El <a href="#f3">C&Oacute;DIGO 2</a> muestra un ejemplo de esta situaci&oacute;n. </FONT></p>     <p>&nbsp;</p>     <p align="center"><a name="f3"></a><img src="/img/revistas/rium/v10n19/v10n19a14f3.jpg"></p>     <p align="center">&nbsp;</p>     <p><FONT SIZE="2" FACE="Verdana"> En el <a href="#f3">C&Oacute;DIGO 2</a>, los datos locales a <I>main</I> (los elementos del arreglo llamado ''<I>buffer</I>'') se encuentran almacenados en la pila. El operador (''&#62;&#62;'') sobrecargado en <I>istream </I>no hace una validaci&oacute;n de l&iacute;mites sobre la variable de destino. Por lo tanto, si el usuario ingresa una cantidad de datos superior a 128 bytes comenzar&aacute; a sobrescribir datos en la pila, por ejemplo, el apuntador base de la pila de la funci&oacute;n anterior y la direcci&oacute;n de retorno almacenada por la instrucci&oacute;n <I>CALL</I>. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Un usuario puede fabricar la entrada del programa de manera que se escriba en la direcci&oacute;n de retorno almacenada, una direcci&oacute;n con las instrucciones que se desea ejecutar. De este modo, cuando la funci&oacute;n <I>main</I> ejecute la instrucci&oacute;n ''<I>ret</I>'' se cargar&aacute; en <I>EIP</I> una direcci&oacute;n controlada por el usuario forzando la ejecuci&oacute;n de c&oacute;digo arbitrario. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"><B>1.2 Cadenas de formato	</B></FONT></p>     ]]></body>
<body><![CDATA[<p><FONT SIZE="2" FACE="Verdana"> El <a href="#f4">C&Oacute;DIGO 3</a> muestra un programa vulnerable que utiliza cadenas de formato. </FONT></p>     <p>&nbsp;</p>     <p align="center"><a name="f4"></a><img src="/img/revistas/rium/v10n19/v10n19a14f4.jpg"></p>     <p align="center">&nbsp;</p>     <p><FONT SIZE="2" FACE="Verdana"> El problema del <a href="#f4">C&Oacute;DIGO 3</a> radica en que la cadena de formato de la l&iacute;nea 7 puede ser controlada por el usuario. En 1999, Tymm Twillman envi&oacute; un correo al equipo de desarrollo de la biblioteca est&aacute;ndar de C &#91;3] ilustrando c&oacute;mo se puede aprovechar este tipo de vulnerabilidades para obtener ejecuci&oacute;n de c&oacute;digo arbitrario. Para obtener ejecuci&oacute;n de c&oacute;digo arbitrario, se utiliza el modificador de formato ''%n''. En &#91;8], se presenta la t&eacute;cnica de c&oacute;mo se puede obtener ejecuci&oacute;n de c&oacute;digo arbitrario de este modo. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"><B>1.3 Desbordamientos en el mont&iacute;culo </B></FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> El asignador de memoria ofrecido por la biblioteca est&aacute;ndar de C ofrece su interfaz a trav&eacute;s de las funciones <I>calloc(), malloc(), free()</I> y <I>realloc()</I>. Cada desarrollador de esta biblioteca implementa de manera diferente las estructuras de datos y los mecanismos que utiliza para administrar el mont&iacute;culo. La biblioteca est&aacute;ndar de C de GNU, utiliza un asignador de memoria conocido como <I>ptmalloc</I>, cuyo c&oacute;digo est&aacute; basado en el asignador de memoria desarrollado por Doug Lea &#91;9]. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Los pedazos del asignador de memoria desarrollado por Doug Lea llevan consigo informaci&oacute;n, antes y despu&eacute;s de los datos. El principal objetivo es permitir que dos pedazos sin utilizar puedan unirse en un pedazo m&aacute;s largo, reduciendo la fragmentaci&oacute;n. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Cuando se realiza un desbordamiento en el mont&iacute;culo, se pueden modificar los datos de control de los pedazos. Estos datos de control contienen apuntadores para la inclusi&oacute;n de pedazos libres en listas doblemente enlazadas. Cuando se hace un llamado a free() utilizando un pedazo que tiene un pedazo adyacente P libre, el algoritmo de la funci&oacute;n hace un llamado al macro del <a href="#f5">C&Oacute;DIGO 4</a>. </FONT></p>     <p>&nbsp;</p>     ]]></body>
<body><![CDATA[<p align="center"><a name="f5"></a><img src="/img/revistas/rium/v10n19/v10n19a14f5.jpg"></p>     <p align="center">&nbsp;</p>     <p><FONT SIZE="2" FACE="Verdana"> Si el pedazo contiguo P ha sido malformado, se puede escribir en posiciones arbitrarias de memoria y obtener ejecuci&oacute;n de c&oacute;digo arbitrario. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> La t&eacute;cnica del macro <I>unlink</I> no tiene una aplicaci&oacute;n en las versiones posteriores a 2004 de la biblioteca est&aacute;ndar de C de GNU. Sin embargo, presenta un precedente de que la escritura en posiciones arbitrarias de memoria puede resultar en ejecuci&oacute;n de c&oacute;digo arbitrario. En &#91;10] se presentan cinco t&eacute;cnicas aplicables al asignador de memoria actual. </FONT></p>     <p>&nbsp;</p>     <p><FONT SIZE="3" FACE="Verdana"><B>2. MECANISMOS DE PROTECCI&Oacute;N A ATAQUES POR CORRUPCI&Oacute;N DE MEMORIA	 </B></FONT></p>     <p><FONT SIZE="2" FACE="Verdana">Existen dos alternativas para mitigar el riesgo que representan los fallos por corrupci&oacute;n de memoria. El primer enfoque consiste en utilizar mecanismos en el lado del programador para evitar que las vulnerabilidades existan. El segundo enfoque consiste en otorgar protecciones adicionales desde el sistema operativo, el compilador y las bibliotecas. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Esta secci&oacute;n introduce los mecanismos de defensa utilizados para responder a los ataques por corrupci&oacute;n de memoria. Las protecciones presentadas en esta secci&oacute;n no son exhaustivas; sin embargo, se presentan las t&eacute;cnicas m&aacute;s relevantes y comunes de los sistemas modernos. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"><B>2.1 Defensa al lado del programador </B></FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Las entradas de usuario comunican las decisiones que este ha tomado. Se debe prestar especial atenci&oacute;n al tama&ntilde;o, la naturaleza y la validez contextual de la entrada. Muchos sistemas almacenan informaci&oacute;n de control en lugares adyacentes a los datos, por lo que un fallo en el control de la memoria puede permitir la modificaci&oacute;n de estos datos de control. Tal es el caso de las direcciones de retorno almacenadas en la pila &#91;2], los datos de control del mont&iacute;culo &#91;4], los apuntadores virtuales &#91;11], apuntadores a otras estructuras &#91;12], entre otros. </FONT></p>     ]]></body>
<body><![CDATA[<p><FONT SIZE="2" FACE="Verdana"> Algunos lenguajes son m&aacute;s susceptibles a los ataques por corrupci&oacute;n de memoria. La mayor&iacute;a de los lenguajes interpretados ofrecen control de l&iacute;mites y detecci&oacute;n de desbordamientos en tiempo de ejecuci&oacute;n; algunos ofrecen detecci&oacute;n de estas situaciones en tiempo de compilaci&oacute;n (PERL, JAVASCRIPT). Otros lenguajes (JAVA, .NET, LISP, OCAML) ofrecen una capa de abstracci&oacute;n entre la administraci&oacute;n de la memoria de usuario y el programador; esta capa de abstracci&oacute;n puede detectar y prevenir las vulnerabilidades que permiten la corrupci&oacute;n de la memoria. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Es importante anotar que los mecanismos de detecci&oacute;n y prevenci&oacute;n que ofrecen estos lenguajes tienen un impacto significativo en el rendimiento de las aplicaciones. Esto puede ser tolerable dependiendo de los requerimientos; la decisi&oacute;n final es una pregunta abierta de ingenier&iacute;a de software. Sin embargo, los programas deben usar las mismas reglas para ejecutar su c&oacute;digo; esto quiere decir que pueden existir vulnerabilidades en los int&eacute;rpretes o los mecanismos que utilizan estos programas. Burch &#91;13] presenta un escenario de ataque por cadenas de formato aplicado al lenguaje PERL, y Shahin &#91;14] presenta una vulnerabilidad por corrupci&oacute;n de memoria de una biblioteca en la m&aacute;quina virtual JAVA. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> A&uacute;n en lenguajes que exponen la administraci&oacute;n de la memoria, el uso de apuntadores din&aacute;micos &#91;15] puede reducir el riesgo de experimentar corrupci&oacute;n de memoria. La biblioteca est&aacute;ndar de C++ incluye algo conocido como ''smart pointers'' que facilita el control de datos en el mont&iacute;culo. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Es importante incluir pruebas relacionadas con el comportamiento seguro de la aplicaci&oacute;n en el proceso de desarrollo. Las pruebas relacionadas con los fallos por corrupci&oacute;n de memoria fueron clasificadas por Sutton et al. &#91;16] como pruebas de caja blanca, caja gris y caja negra. Las pruebas de caja blanca consisten en la revisi&oacute;n del c&oacute;digo fuente para buscar instrucciones que lleven a fallos de seguridad. Las pruebas de caja gris consisten en la revisi&oacute;n del programa utilizando herramientas de ingenier&iacute;a inversa. Las pruebas de caja negra, tambi&eacute;n conocidas como ''<I>fuzzing</I>'' consisten en someter la aplicaci&oacute;n a entradas pseudoaleatorias para detectar comportamientos an&oacute;malos de la aplicaci&oacute;n. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"><B>2.2 Defensa del sistema operativo  </B></FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Aunque existen muchos mecanismos de defensa, este documento presenta dos de las t&eacute;cnicas m&aacute;s importantes para prevenir la ejecuci&oacute;n de c&oacute;digo arbitrario. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> La primera t&eacute;cnica fue introducida por AMD con un bit de seguridad conocido como NX (del ingl&eacute;s, No eXecute), que posteriormente Intel comercializ&oacute; como XD en su procesador pentium 4 (del ingl&eacute;s, eXecuteDisable). </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Sin importar el nombre que se d&eacute; a esta tecnolog&iacute;a, se trata de un bit en las entradas de la tabla de p&aacute;ginas del proceso que, una vez habilitado, hace que el procesador genere excepciones para prevenir la ejecuci&oacute;n de instrucciones en ese espacio de memoria. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> El bit NX/XD es una modificaci&oacute;n importante al sistema operativo y, por lo tanto, algunos programas no est&aacute;n dise&ntilde;ados para trabajar con esta tecnolog&iacute;a. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> La segunda t&eacute;cnica es conocida como distribuci&oacute;n aleatoria del espacio de direcciones (del ingl&eacute;s, <I>Adress Space Layout Randomization ASLR</I>); obtuvo su nombre en 2001, cuando el equipo PAX liber&oacute; la primera implementaci&oacute;n como un parche del n&uacute;cleo de Linux. </FONT></p>     ]]></body>
<body><![CDATA[<p><FONT SIZE="2" FACE="Verdana"> La t&eacute;cnica se basa en el hecho de que un atacante utiliza direcciones de memoria fijas para lograr la ejecuci&oacute;n de c&oacute;digo arbitrario. La idea principal es responder a esta estrategia distribuyendo aleatoriamente el espacio de direcciones virtuales de los procesos. Con esta medida, un atacante no puede determinar de manera confiable las regiones del espacio de direcciones del proceso. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Existen diferentes implementaciones de esta tecnolog&iacute;a para diferentes sistemas operativos y en algunas situaciones la relaci&oacute;n es muchos a uno (diferentes implementaciones para el mismo sistema operativo). </FONT></p>     <p>&nbsp;</p>     <p><FONT SIZE="3" FACE="Verdana"><B>3. OFENSA DE APLICACIONES EN LOS SISTEMAS OPERATIVOS MODERNOS </B></FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> </FONT><FONT SIZE="2" FACE="Verdana">La t&eacute;cnica de ''retorno a biblioteca'' &#91;17] es el concepto general que utilizan los atacantes para evadir las restricciones de los privilegios de ejecuci&oacute;n en las regiones de datos. Esta t&eacute;cnica es m&aacute;s conocida como ''retorno a libc'' (del ingl&eacute;s, ''returntolibc''), aunque no es necesario que la biblioteca sea libc. La estrategia aprovecha la capacidad de escribir en la pila del proceso para forzar el programa a ejecutar funciones arbitrarias (ubicadas en p&aacute;ginas que no tienen habilitado el bit NX/XD) &#91;17].</FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Un atacante puede configurar la pila como se muestra en la <a href="#f6">figura 2</a>, para invocar a <I>mprotect</I> y modificar los privilegios del c&oacute;digo inyectado. </FONT></p>     <p>&nbsp;</p>     <p align="center"><a name="f6"></a><img src="/img/revistas/rium/v10n19/v10n19a14f6.jpg"></p>     <p align="center">&nbsp;</p>     <p><FONT SIZE="2" FACE="Verdana"> La estrategia de <I>mprotect</I> puede implementarse en otros sistemas con funciones similares. Sin embargo, Le &#91;5] y Buchanan et al. &#91;18] presentan una estrategia para reutilizar las instrucciones de la aplicaci&oacute;n y construir c&oacute;digo arbitrario. La t&eacute;cnica es conocida como programaci&oacute;n orientada a retornos (del ingl&eacute;s, Return Oriented Porgramming ROP). </FONT></p>     ]]></body>
<body><![CDATA[<p><FONT SIZE="2" FACE="Verdana"> Para evadir la distribuci&oacute;n aleatoria del espacio de direcciones pueden emplearse diferentes estrategias. M&uuml;ller &#91;19] hace una recopilaci&oacute;n sobre algunas de estas t&eacute;cnicas. Una alternativa consiste en burlar el mecanismo de aleatoriedad utilizando fuerza bruta; esta estrategia tiene como desventaja que puede ser f&aacute;cilmente detectada y requiere que la aplicaci&oacute;n vulnerable pueda recuperarse de un fallo de segmentaci&oacute;n. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Las implementaciones deben evitar consumir la entrop&iacute;a del sistema operativo, por lo tanto es posible que existan debilidades estad&iacute;sticas en la implementaci&oacute;n. Whitehouse &#91;20] muestra debilidades importantes de la implementaci&oacute;n del sistema operativo Microsoft Windows Vista. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Por la forma en que algunos procesadores manejan la memoria, es posible modificar &uacute;nicamente los bytes menos significativos de las direcciones. Dependiendo de donde se encuentre el fallo de seguridad, se puede aprovechar esto para reducir la cantidad de bytes desconocidos y mejorar las posibilidades del atacante. En algunos casos, es posible utilizar esta t&eacute;cnica para tener un ataque determinista. Algunas bibliotecas pueden ser excluidas de esta medida de seguridad. En este caso, es posible utilizar retornos a biblioteca para lograr ejecuci&oacute;n de c&oacute;digo arbitrario. En las versiones del kernel inferiores a 2.6.20, la biblioteca Linux-gate no era distribuida aleatoriamente y, por lo tanto, un atacante pod&iacute;a utilizarla para lograr su objetivo. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> En los sistemas Microsoft, es usual que algunos m&oacute;dulos no sean incluidos en el proceso de distribuci&oacute;n aleatoria. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Aunque algunas implementaciones pueden hacer aleatoria la ubicaci&oacute;n del c&oacute;digo principal del programa, esto no es usual. Para que esto sea posible, el c&oacute;digo del programa debe ser compilado con posici&oacute;n independiente. Esto significa que se deben recompilar las aplicaciones para soportar esta caracter&iacute;stica. Una primera observaci&oacute;n podr&iacute;a indicar que siempre se pueden utilizar direcciones en el c&oacute;digo del programa; sin embargo, las instrucciones &uacute;tiles en dicho c&oacute;digo suelen ser escasas, debido a que gran parte de la funcionalidad de las aplicaciones se encuentra almacenada en las bibliotecas &#91;19]. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Algunos espacios de memoria de la pila pueden contener direcciones de memoria que referencian la pila. En estos casos, puede utilizarse una estrategia de retornar a instrucciones ''RET'' m&uacute;ltiples veces de manera que se pueda forzar el programa a saltar al c&oacute;digo inyectado (utilizando las instrucciones almacenadas en la regi&oacute;n de c&oacute;digo del programa). La <a href="#f7">figura 3</a> muestra la pila con un ataque del tipo retorno a retorno. </FONT></p>     <p>&nbsp;</p>     <p align="center"><a name="f7"></a><img src="/img/revistas/rium/v10n19/v10n19a14f7.jpg"></p>     <p align="center">&nbsp;</p>     <p><FONT SIZE="2" FACE="Verdana"> La direcci&oacute;n de retorno almacenada en la pila se encuentra en el lugar donde aparece por primera vez 0x08049654 que es una direcci&oacute;n usual para la regi&oacute;n del c&oacute;digo del programa. En el cuadro de la izquierda se puede observar que la instrucci&oacute;n en dicha direcci&oacute;n es ''RET''. Por lo tanto, el programa comenzar&aacute; a retornar hasta que <I>EIP</I> sea sobrescrito con 0xBFFFFA09 que es una direcci&oacute;n en el medio de la regi&oacute;n con <I>NOPS</I>. </FONT></p>     ]]></body>
<body><![CDATA[<p><FONT SIZE="2" FACE="Verdana"> Algunas aplicaciones permiten al atacante asignar grandes bloques de datos en el mont&iacute;culo (esto es usual en ataques al lado del cliente, donde se pueden utilizar lenguajes que utilizan compiladores que permiten este prop&oacute;sito); en estas situaciones se puede forzar la aplicaci&oacute;n a utilizar una direcci&oacute;n del mont&iacute;culo que tenga altas posibilidades de contener los datos inyectados. Para mejorar la posibilidad de &eacute;xito, se suelen asignar datos con la forma de la <a href="#f8">figura 4</a>. </FONT></p>     <p>&nbsp;</p>     <p align="center"><a name="f8"></a><img src="/img/revistas/rium/v10n19/v10n19a14f8.jpg"></p>     <p align="center">&nbsp;</p>     <p><FONT SIZE="3" FACE="Verdana"><B>4. TRABAJOS FUTUROS </B></FONT></p>     <p><FONT SIZE="2" FACE="Verdana">Los adelantos de los mecanismos de protecci&oacute;n han demostrado ser importantes elementos para mitigar el riesgo. Existen diferentes formas de implementar estas protecciones. La forma en que se implementan los mecanismos de defensa puede disminuir la efectividad de estas tecnolog&iacute;as. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Existen alternativas para determinar la existencia de los mecanismos de protecci&oacute;n presentados en este documento. De manera aislada se han realizado mediciones para evaluar la efectividad de algunas de estas medidas de seguridad. Sin embargo, no existe un m&eacute;todo que permita evaluar o comparar diferentes implementaciones en las medidas de seguridad de manera objetiva. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Los adelantes en los mecanismos de defensas de los sistemas operativos de prop&oacute;sito general han creado la pregunta de si estas medidas son aplicables en el contexto de sistemas embebidos y si en dichas arquitecturas se cuenta con la seguridad adecuada para el contexto que representan. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Las medidas de protecci&oacute;n afectan principalmente a las aplicaciones de usuario y esto ha generado que muchos atacantes comiencen a evaluar los fallos de seguridad del n&uacute;cleo del sistema operativo. Se deber&iacute;an incluir mecanismos de defensa adecuados para disminuir el riesgo que experimentan los programas en modo supervisor, ya que el inter&eacute;s por atacar los componentes del sistema operativo cada vez es mayor. </FONT></p>     <p>&nbsp;</p>     ]]></body>
<body><![CDATA[<p><FONT SIZE="3" FACE="Verdana"><B>5. CONCLUSIONES </B></FONT></p>     <p><FONT SIZE="2" FACE="Verdana">Los fallos por corrupci&oacute;n de memoria, al igual que otro tipo de debilidades, son causados por errores humanos que pueden existir en cualquier etapa del proceso de desarrollo de los sistemas computacionales. Es importante concientizar a los ingenieros de los requerimientos no funcionales y las buenas pr&aacute;cticas de programaci&oacute;n que ayudan a disminuir el riesgo de experimentar vulnerabilidades en los sistemas. La primera l&iacute;nea de defensa en las aplicaciones es un buen proceso de desarrollo. El an&aacute;lisis de requerimientos de seguridad, las buenas pr&aacute;cticas de dise&ntilde;o e implementaci&oacute;n y un adecuado control de calidad con un conjunto de pruebas adecuado, es fundamental para reducir el riesgo de experimentar este tipo de fallos. </FONT></p>     <p><FONT SIZE="2" FACE="Verdana"> Aunque esta l&iacute;nea de protecci&oacute;n deber&iacute;a ser suficiente para detener los ataques, se prefieren los enfoques de protecci&oacute;n en diferentes capas. Para ayudar a mitigar los riesgos, los sistemas operativos han incluido diferentes mecanismos de protecci&oacute;n. Dos de los mecanismos m&aacute;s representativos son: hacer aleatorio el espacio virtual de direcciones y los privilegios de ejecuci&oacute;n en las regiones de memoria. Sin embargo, estos mecanismos no evitan que la vulnerabilidad exista; por el contrario, hacen que el proceso de un atacante para aprovechar una vulnerabilidad sea m&aacute;s complicado. Es importante mencionar que estos mecanismos de protecci&oacute;n no son perfectos y que los atacantes han desarrollado t&eacute;cnicas para evadir su funcionamiento. Esto no quiere decir que las medidas de protecci&oacute;n no sean efectivas o que sean obsoletas; simplemente, es una manifestaci&oacute;n de la teor&iacute;a del riesgo residual. </FONT></p>     <p>&nbsp;</p>     <p><FONT SIZE="3" FACE="Verdana"><B>REFERENCIAS	 </B></FONT></p>     <!-- ref --><p><FONT SIZE="2" FACE="Verdana">&#91;1] H. Meer, ''Memory Corruption Attacks The (Almost) Complete History,'' presentado en Black Hat USA, Las Vegas, 2010. </FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000118&pid=S1692-3324201100020001400001&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><FONT SIZE="2" FACE="Verdana"> &#91;2] E. Levy. ''Smashing the stack for fun and profit, PhrackInc,'' &#91;En l&iacute;nea], acceso octubre 2010; Disponible: <a href="http://www.phrack.com/issues.html?issue=49&id=14, 1996" target="_blank">http://www.phrack.com/issues.html&#63;issue=49id=14</a>, 1996. </FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000119&pid=S1692-3324201100020001400002&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><FONT SIZE="2" FACE="Verdana"> &#91;3] T. Twillman. ''Exploitforproftpd 1.2.0pre6,'' &#91;En l&iacute;nea], acceso octubre 2010; Disponible: <a href="http://seclists.org/bugtraq/1999/Sep/328" target="_blank">http://seclists.org/bugtraq/1999/Sep/328</a>, 1999. </FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000120&pid=S1692-3324201100020001400003&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><FONT SIZE="2" FACE="Verdana"> &#91;4] M. Kaempf. ''VudoMallocTricks,PhrackInc,'' &#91;En l&iacute;nea], acceso octubre 2010; Disponible: <a href="http://www.phrack.org/issues.html?issue=57&id=8" target="_blank">http://www.phrack.org/issues.html&#63;issue=57id=8</a>, 2001. </FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000121&pid=S1692-3324201100020001400004&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><FONT SIZE="2" FACE="Verdana"> &#91;5] L. Le, ''Payload Already Inside: Data Reuse ForRop Exploits,'' presentado en Black Hat USA, Las Vegas, 2010. </FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000122&pid=S1692-3324201100020001400005&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><FONT SIZE="2" FACE="Verdana"> &#91;6] J. Pincus, y B. Baker, ''Beyond stack smashing: recent advances in exploiting buffer overruns,'' <I>IEEE Security &amp; Privacy,</I> vol. 2, no. 4, pp. 20-27, 2004. </FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000123&pid=S1692-3324201100020001400006&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><FONT SIZE="2" FACE="Verdana"> &#91;7] A. Fog. ''Calling conventions for different C++ compilers and operating systems, Copenhagen University College of Engineering,'' &#91;En l&iacute;nea], acceso septiembre 2010; Disponible: <a href="http://www.agner.org/optimize/calling_conventions.pdf" target="_blank">http://www.agner.org/optimize/calling_conventions.pdf</a>, 2010. </FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000124&pid=S1692-3324201100020001400007&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><FONT SIZE="2" FACE="Verdana"> &#91;8] R. Gera. ''Advances in format string exploitation, PhrackInc,'' &#91;En l&iacute;nea], acceso septiembre 2010; Disponible: <a href="http://www.phrack.org/issues.html?issue=57&id=9#article" target="_blank">http://www.phrack.org/issues.html&#63;issue=57id=9#article</a>, 2002. </FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000125&pid=S1692-3324201100020001400008&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><FONT SIZE="2" FACE="Verdana"> &#91;9] D. Lea. ''The design of the basis of the glibc allocator,'' &#91;En l&iacute;nea], acceso septiembre 2010; Disponible: http://gee.cs.oswego.edu/dl/html/malloc.html, 1996. </FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000126&pid=S1692-3324201100020001400009&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><FONT SIZE="2" FACE="Verdana"> &#91;10] P. Phantasmagoria. ''The Malloc Maleficarum. Glibc Malloc Exploitation Techniques, Security Focus,'' &#91;En l&iacute;nea], acceso septiembre 2010; Disponible: <a href="http://www.securityfocus.com/archive/1/413007/30/0/threaded" target="_blank">http://www.securityfocus.com/archive/1/413007/30/0/threaded</a>, 2005. </FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000127&pid=S1692-3324201100020001400010&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><FONT SIZE="2" FACE="Verdana"> &#91;11] J. Afek, y A. Sharabani, ''Dangling Pointers Smashing the pointer for fun and profit,'' presentado en Black Hat USA, Las Vegas, 2007. </FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000128&pid=S1692-3324201100020001400011&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><FONT SIZE="2" FACE="Verdana"> &#91;12] M. Conover. ''Double Free Vulnerabilities, Symantec,'' &#91;En l&iacute;nea], acceso octubre 2010; Disponible: <a href="http://www.symantec.com/connect/blogs/double-free-vulnerabilities-part-1" target="_blank">http://www.symantec.com/connect/blogs/double-free-vulnerabilities-part-1</a>, 2007. </FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000129&pid=S1692-3324201100020001400012&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><FONT SIZE="2" FACE="Verdana"> &#91;13] H. Burch. ''Vulnerability Note VU#946969, US-CERT,'' &#91;En l&iacute;nea], acceso septiembre 2010; Disponible: <a href="http://www.kb.cert.org/vuls/id/946969" target="_blank">http://www.kb.cert.org/vuls/id/946969</a>, 2005. </FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000130&pid=S1692-3324201100020001400013&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><FONT SIZE="2" FACE="Verdana"> &#91;14] Shahin. ''Java CMM readMabCurveData stack overflow, abysssec,'' &#91;En l&iacute;nea], acceso agosto 2010; Disponible: <a href="http://www.exploit-db.com/exploits/15056/" target="_blank">http://www.exploit-db.com/exploits/15056/</a>, 2010. </FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000131&pid=S1692-3324201100020001400014&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><FONT SIZE="2" FACE="Verdana"> &#91;15] S. M. Pike<I> et al.</I>, ''Checkmate: Cornering C++ Dynamic Memory Errors With Checked Pointers,'' presentado en 31st SIGCSE Technical Symposium on Computer Science Education: ACM Press, 2000. </FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000132&pid=S1692-3324201100020001400015&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><FONT SIZE="2" FACE="Verdana"> &#91;16] M. Sutton<I> et al.</I>, <I>Fuzzing: Brute Force Vulnerability Discovery</I>, Indiana: Addison-Wesley Professional, 2007, p. </FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000133&pid=S1692-3324201100020001400016&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><FONT SIZE="2" FACE="Verdana"> &#91;17] Nergal. ''The advanced return-into-lib(c) exploits, PhrackInc,'' &#91;En l&iacute;nea], acceso septiembre 2010; Disponible: <a href="http://www.phrack.org/issues.html?issue=58&id=4" target="_blank">http://www.phrack.org/issues.html&#63;issue=58id=4</a>, 2001. </FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000134&pid=S1692-3324201100020001400017&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><FONT SIZE="2" FACE="Verdana"> &#91;18] E. E. Buchanan<I> et al.</I>, ''Return-oriented Programming: Exploitation without Code Injection,'' presentado en Black Hat USA, Las Vegas, 2008. </FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000135&pid=S1692-3324201100020001400018&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><FONT SIZE="2" FACE="Verdana"> &#91;19] T. M&uuml;ller, ''ASLR Smack &amp; Laugh Reference,'' presentado en Seminar on Advanced Exploitation Techniques, Germany, 2008. </FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000136&pid=S1692-3324201100020001400019&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><!-- ref --><p><FONT SIZE="2" FACE="Verdana"> &#91;20] O. Whitehouse. ''An Analysis of Address Space Layout Randomization on Windows Vista, SYMANTEC,'' &#91;En l&iacute;nea], acceso octubre 2010; Disponible: <a href="http://www.symantec.com/avcenter/reference/Address_Space_Layout_Randomization.pdf" target="_blank">http://www.symantec.com/avcenter/reference/Address_Space_Layout_Randomization.pdf</a>, 2007. </FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&#160;<a href="javascript:void(0);" onclick="javascript: window.open('/scielo.php?script=sci_nlinks&ref=000137&pid=S1692-3324201100020001400020&lng=','','width=640,height=500,resizable=yes,scrollbars=1,menubar=yes,');">Links</a>&#160;]<!-- end-ref --><p align="center">&nbsp;</p>      ]]></body><back>
<ref-list>
<ref id="B1">
<label>[1]</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Meer]]></surname>
<given-names><![CDATA[H.]]></given-names>
</name>
</person-group>
<source><![CDATA[''Memory Corruption Attacks The (Almost) Complete History,'']]></source>
<year>2010</year>
<publisher-loc><![CDATA[Las Vegas ]]></publisher-loc>
</nlm-citation>
</ref>
<ref id="B2">
<label>[2]</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Levy]]></surname>
<given-names><![CDATA[E.]]></given-names>
</name>
</person-group>
<source><![CDATA[''Smashing the stack for fun and profit, PhrackInc,'']]></source>
<year>1996</year>
</nlm-citation>
</ref>
<ref id="B3">
<label>[3]</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Twillman]]></surname>
<given-names><![CDATA[T.]]></given-names>
</name>
</person-group>
<source><![CDATA[''Exploitforproftpd 1.2.0pre6,'']]></source>
<year>1999</year>
</nlm-citation>
</ref>
<ref id="B4">
<label>[4]</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Kaempf]]></surname>
<given-names><![CDATA[M.]]></given-names>
</name>
</person-group>
<source><![CDATA[''VudoMallocTricks,PhrackInc,'']]></source>
<year>2001</year>
</nlm-citation>
</ref>
<ref id="B5">
<label>[5]</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Le]]></surname>
<given-names><![CDATA[L.]]></given-names>
</name>
</person-group>
<source><![CDATA[''Payload Already Inside: Data Reuse ForRop Exploits,'']]></source>
<year>2010</year>
<publisher-loc><![CDATA[Las Vegas ]]></publisher-loc>
</nlm-citation>
</ref>
<ref id="B6">
<label>[6]</label><nlm-citation citation-type="journal">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Pincus]]></surname>
<given-names><![CDATA[J.]]></given-names>
</name>
<name>
<surname><![CDATA[Baker]]></surname>
<given-names><![CDATA[B.]]></given-names>
</name>
</person-group>
<article-title xml:lang="en"><![CDATA[Beyond stack smashing: recent advances in exploiting buffer overruns]]></article-title>
<source><![CDATA[IEEE Security & Privacy]]></source>
<year>2004</year>
<volume>2</volume>
<numero>4</numero>
<issue>4</issue>
<page-range>20-27</page-range></nlm-citation>
</ref>
<ref id="B7">
<label>[7]</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Fog]]></surname>
<given-names><![CDATA[A.]]></given-names>
</name>
</person-group>
<source><![CDATA[''Calling conventions for different C++ compilers and operating systems, Copenhagen University College of Engineering,'']]></source>
<year>2010</year>
</nlm-citation>
</ref>
<ref id="B8">
<label>[8]</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Gera]]></surname>
<given-names><![CDATA[R.]]></given-names>
</name>
</person-group>
<source><![CDATA[''Advances in format string exploitation, PhrackInc,'']]></source>
<year>2002</year>
</nlm-citation>
</ref>
<ref id="B9">
<label>[9]</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Lea]]></surname>
<given-names><![CDATA[D.]]></given-names>
</name>
</person-group>
<source><![CDATA[''The design of the basis of the glibc allocator,'']]></source>
<year>1996</year>
</nlm-citation>
</ref>
<ref id="B10">
<label>[10]</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Phantasmagoria]]></surname>
<given-names><![CDATA[P.]]></given-names>
</name>
</person-group>
<source><![CDATA[''The Malloc Maleficarum. Glibc Malloc Exploitation Techniques, Security Focus,'']]></source>
<year>2005</year>
</nlm-citation>
</ref>
<ref id="B11">
<label>[11]</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Afek]]></surname>
<given-names><![CDATA[J.]]></given-names>
</name>
<name>
<surname><![CDATA[Sharabani]]></surname>
<given-names><![CDATA[A.]]></given-names>
</name>
</person-group>
<source><![CDATA[''Dangling Pointers Smashing the pointer for fun and profit,'']]></source>
<year>2007</year>
<publisher-loc><![CDATA[Las Vegas ]]></publisher-loc>
</nlm-citation>
</ref>
<ref id="B12">
<label>[12]</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Conover]]></surname>
<given-names><![CDATA[M.]]></given-names>
</name>
</person-group>
<source><![CDATA[''Double Free Vulnerabilities, Symantec,'']]></source>
<year>2007</year>
</nlm-citation>
</ref>
<ref id="B13">
<label>[13]</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Burch]]></surname>
<given-names><![CDATA[H.]]></given-names>
</name>
</person-group>
<source><![CDATA[''Vulnerability Note VU#946969, US-CERT,'']]></source>
<year>2005</year>
</nlm-citation>
</ref>
<ref id="B14">
<label>[14]</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Shahin]]></surname>
</name>
</person-group>
<source><![CDATA[''Java CMM readMabCurveData stack overflow, abysssec,'']]></source>
<year>2010</year>
</nlm-citation>
</ref>
<ref id="B15">
<label>[15]</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Pike]]></surname>
<given-names><![CDATA[S. M.]]></given-names>
</name>
</person-group>
<source><![CDATA[''Checkmate: Cornering C++ Dynamic Memory Errors With Checked Pointers,'']]></source>
<year>2000</year>
<publisher-name><![CDATA[ACM Press]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B16">
<label>[16]</label><nlm-citation citation-type="book">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Sutton]]></surname>
<given-names><![CDATA[M.]]></given-names>
</name>
</person-group>
<source><![CDATA[Fuzzing: Brute Force Vulnerability Discovery]]></source>
<year>2007</year>
<publisher-loc><![CDATA[Indiana ]]></publisher-loc>
<publisher-name><![CDATA[Addison-Wesley Professional]]></publisher-name>
</nlm-citation>
</ref>
<ref id="B17">
<label>[17]</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Nergal]]></surname>
</name>
</person-group>
<source><![CDATA[''The advanced return-into-lib(c) exploits, PhrackInc,'']]></source>
<year>2001</year>
</nlm-citation>
</ref>
<ref id="B18">
<label>[18]</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Buchanan]]></surname>
<given-names><![CDATA[E. E.]]></given-names>
</name>
</person-group>
<source><![CDATA[''Return-oriented Programming: Exploitation without Code Injection,'']]></source>
<year>2008</year>
<publisher-loc><![CDATA[Las Vegas ]]></publisher-loc>
</nlm-citation>
</ref>
<ref id="B19">
<label>[19]</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Müller]]></surname>
<given-names><![CDATA[T.]]></given-names>
</name>
</person-group>
<source><![CDATA[''ASLR Smack & Laugh Reference,'']]></source>
<year>2008</year>
</nlm-citation>
</ref>
<ref id="B20">
<label>[20]</label><nlm-citation citation-type="">
<person-group person-group-type="author">
<name>
<surname><![CDATA[Whitehouse]]></surname>
<given-names><![CDATA[O.]]></given-names>
</name>
</person-group>
<source><![CDATA[''An Analysis of Address Space Layout Randomization on Windows Vista, SYMANTEC,'']]></source>
<year>2007</year>
</nlm-citation>
</ref>
</ref-list>
</back>
</article>
