<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?action=history&amp;feed=atom&amp;title=Buffer_Overflow_y_bit_NX</id>
		<title>Buffer Overflow y bit NX - Historial de revisiones</title>
		<link rel="self" type="application/atom+xml" href="https://1984.lsi.us.es/wiki-ssoo/index.php?action=history&amp;feed=atom&amp;title=Buffer_Overflow_y_bit_NX"/>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Buffer_Overflow_y_bit_NX&amp;action=history"/>
		<updated>2026-06-23T18:54:05Z</updated>
		<subtitle>Historial de revisiones para esta página en el wiki</subtitle>
		<generator>MediaWiki 1.29.0</generator>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Buffer_Overflow_y_bit_NX&amp;diff=952&amp;oldid=prev</id>
		<title>Alexrdp: /* Solución */</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Buffer_Overflow_y_bit_NX&amp;diff=952&amp;oldid=prev"/>
				<updated>2011-06-02T20:48:23Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Solución&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;' lang='es'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Revisión anterior&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revisión del 20:48 2 jun 2011&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l83&quot; &gt;Línea 83:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Línea 83:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	...&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	...&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;strcpy&lt;/del&gt;(buffer, argv[1], sizeof(buffer));&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;strncpy&lt;/ins&gt;(buffer, argv[1], sizeof(buffer));&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	buffer[sizeof(buffer) - 1] = '\0'; // Caracter nulo&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	buffer[sizeof(buffer) - 1] = '\0'; // Caracter nulo&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	...&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	...&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Buffer_Overflow_y_bit_NX&amp;diff=951&amp;oldid=prev</id>
		<title>Alexrdp: Artículo propuesto en clase</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Buffer_Overflow_y_bit_NX&amp;diff=951&amp;oldid=prev"/>
				<updated>2011-06-02T20:34:21Z</updated>
		
		<summary type="html">&lt;p&gt;Artículo propuesto en clase&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Buffer Overflows =&lt;br /&gt;
&lt;br /&gt;
== Definición y causa ==&lt;br /&gt;
Los desbordamientos de búfer es una vulnerabilidad presente cuando se escribe en un búfer sin validar el tamaño del contenido.&lt;br /&gt;
Esto puede hacer que si se introduce un dato lo suficientemente grande, el búfer se desborde, dando como resultado que se sobreescriba con código del atacante.&lt;br /&gt;
Lo cual constituye un gran problema de seguridad cuando el programa se ejecuta con privilegios de superusuario.&lt;br /&gt;
&lt;br /&gt;
Este error de programación de encuentra comúnmente en programas que gestionan su propio uso de la memoria (P. ej, C/C++).&lt;br /&gt;
Según la OWASP (Proyecto de código abierto sobre seguridad web) es una de las vulnerabilidades más comunes, con un riesgo de explotación muy alto y variado, aún siendo una de las más antiguas y conocidas.&lt;br /&gt;
&lt;br /&gt;
== Ejemplo ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
	char buffer[5];&lt;br /&gt;
	if(argc != 2)&lt;br /&gt;
	{&lt;br /&gt;
		fprintf(stderr, &amp;quot;USO: %s cadena\n&amp;quot;, argv[0]);&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	strcpy(buffer, argv[1]); // Cadenas de 5 o más caracteres causarán desbordamiento&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Otro tipo de buffer overflow: Stack buffer overflow ==&lt;br /&gt;
&lt;br /&gt;
=== Ejemplo modificando el código anterior ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void mi_funcion(char *param)&lt;br /&gt;
{&lt;br /&gt;
	char buffer[5];&lt;br /&gt;
	strcpy(buffer, param);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
	if(argc != 2)&lt;br /&gt;
	{&lt;br /&gt;
		fprintf(stderr, &amp;quot;USO: %s cadena\n&amp;quot;, argv[0]);&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	mi_función(argv[1]);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Funcionamiento del exploit ===&lt;br /&gt;
Contenido de la pila:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	 _______&lt;br /&gt;
	|       |&lt;br /&gt;
	|_______| &amp;lt;- vbles. locales mi_funcion	(char buffer[] y char *param)&lt;br /&gt;
	|_______| &amp;lt;- dirección de retorno	(dir. siguiente instrucción después de mi_funcion)&lt;br /&gt;
	|       |&lt;br /&gt;
	|_______| &amp;lt;- vbles. locales main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Si se desborda el contenido de buffer:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	 _______&lt;br /&gt;
	|xxxxxxx|&lt;br /&gt;
	|xxxxxxx| &amp;lt;- vbles. locales mi_funcion&lt;br /&gt;
	|xxxxxxx| &amp;lt;- dirección de retorno&lt;br /&gt;
	|       |&lt;br /&gt;
	|_______| &amp;lt;- vbles. locales main&lt;br /&gt;
&amp;lt;/pre&amp;gt;	&lt;br /&gt;
x = Código introducido por el atacante&lt;br /&gt;
&lt;br /&gt;
Con lo cual, se han sobreescrito las variables de mi_funcion y la dirección de retorno, que es a la que se hará un jump después de ejecutar el código de mi_funcion.&lt;br /&gt;
Es decir, estamos permitiendo al atacante saltar a una dirección arbitraria y ejecutar el código que contenga. &lt;br /&gt;
	&lt;br /&gt;
No confundir esta vulnerabilidad con un desbordamiento de pila o stack overflow, esto último ocurre cuando la pila de &lt;br /&gt;
invocaciones se desborda por errores como recursión infinita o parámetros de retorno de demasiado tamaño.&lt;br /&gt;
&lt;br /&gt;
== Solución ==&lt;br /&gt;
Una máxima en seguridad informática es validar siempre los datos introducidos por el usuario. En este caso, bastaría con sustituir la línea de strcpy por:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	...&lt;br /&gt;
	strcpy(buffer, argv[1], sizeof(buffer));&lt;br /&gt;
	buffer[sizeof(buffer) - 1] = '\0'; // Caracter nulo&lt;br /&gt;
	...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
De esta forma, nos aseguramos que el contenido del buffer no se desborde al copiar argv[1] en él.&lt;br /&gt;
&lt;br /&gt;
= Bit NX =&lt;br /&gt;
La tecnología NX (No eXecutable) se introdujo para establecer determinadas zonas de memoria como no ejecutables, y así prevenir los ataques de tipo buffer overflow.&lt;br /&gt;
Este bit es el último de cada entrada de la tabla de páginas, y si se encuentra puesto a 1 significa que el contenido de dicha página se considerará como datos y por tanto no podrá ser ejecutado.&lt;br /&gt;
En el caso de arquitecturas como IA32, al basar inicialmente la protección de memoria en el mecanismo de segmentación, hizo que sus servidores sufrieran muchos ataques de buffer overflow &lt;br /&gt;
hasta que se dió mayor control al mecanismo de paginación incluyendo esta tecnología (En el caso de Intel, llamada XD bit-Executing Disabled).  &lt;br /&gt;
&lt;br /&gt;
El núcleo de Linux soporta esta tecnología para arquitecturas IA-32 e IA-64. Si el hardware no proporciona la tecnología NX, el kernel para la arquitectura de 32 bits permite emularla por software.&lt;br /&gt;
&lt;br /&gt;
= Fuentes =&lt;br /&gt;
&lt;br /&gt;
* Securing Ajax Applications (O'Reilly)&lt;br /&gt;
* http://en.wikipedia.org/wiki/Buffer_overflow&lt;br /&gt;
* https://www.owasp.org/index.php/Buffer_Overflow&lt;br /&gt;
* http://en.wikipedia.org/wiki/NX_bit&lt;br /&gt;
* Apartados 2.11 y 4.4 de los apuntes de teoría de TPBN&lt;/div&gt;</summary>
		<author><name>Alexrdp</name></author>	</entry>

	</feed>