{"id":308,"date":"2026-03-06T20:53:07","date_gmt":"2026-03-06T20:53:07","guid":{"rendered":"https:\/\/hackcuba.net\/?p=308"},"modified":"2026-03-06T20:53:07","modified_gmt":"2026-03-06T20:53:07","slug":"buffer-overflow-hackeando-la-pila-i","status":"publish","type":"post","link":"https:\/\/hackcuba.net\/?p=308","title":{"rendered":"Buffer Overflow: hackeando la pila (I)"},"content":{"rendered":"\n<p><em>Stack Overflow<\/em>, <em>Buffer Overflow<\/em> o \u00abromper la pila\u00bb es una de las t\u00e9cnicas m\u00e1s usadas por los hackers profesionales en la fabricaci\u00f3n de <em>spam<\/em>, <em>bugs<\/em>, <em>odays<\/em>, <em>exploits<\/em>, intrusiones a sistemas, etc. Un c\u00f3digo, cuando rompe la pila, puede saltar a una zona cualquiera de memoria y\/o ejecutar un c\u00f3digo maligno que produzca un efecto indeseado en la m\u00e1quina y viole la seguridad del sistema. Es una de las t\u00e9cnicas -sino la m\u00e1s poderosa- que tiene un hacker contempor\u00e1neo\u2026<\/p>\n\n\n\n<!--more-->\n\n\n\n<p><strong>Notas del autor<\/strong>:<br>En los tiempos en los que incursion\u00e9 en el <em>Underworld<\/em> como un <em>newbie<\/em>, me promet\u00ed que ser\u00eda un hacker y que har\u00eda esas cosas que suelen hacer los hackers en las pel\u00edculas y uno no tiene ni idea de c\u00f3mo lo hacen. Y la verdad es que <em>hackers<\/em> como Kevin Mitnick no llegaron a ser grandes descargando programas de una p\u00e1gina Web, sino estudiando y programando sus propios c\u00f3digos, usando sus propias t\u00e9cnicas. Si fu\u00e9ramos a hablar de t\u00e9cnicas como de poderes de un mago, hoy les dar\u00e9 un indicio de c\u00f3mo funciona mi poder favorito de mis tiempos de aprendiz de brujo, les hablo del <em>Buffer Overflow<\/em>.<\/p>\n\n\n\n<p>Para entender bien este texto es necesario que conozcan algo de C y ensamblador, as\u00ed como del funcionamiento interno de la pila. Durante el transcurso del texto ser\u00e9 tan breve como pr\u00e1ctico. Este escrito es s\u00f3lo una introducci\u00f3n al <em>Buffer Overflow<\/em>, no constituye un soporte clave para el domino del mismo. Este art\u00edculo fue creado con fines educativos; el autor no se hacer responsable del mal uso del contenido del mismo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introducci\u00f3n:<\/h2>\n\n\n\n<p>Si buscamos en Internet informaci\u00f3n sobre los <em>Buffer Overflow<\/em>, encontraremos un n\u00famero elevado de vulnerabilidades que lo han usado. Ejemplo de ello son: <em>syslog<\/em>, <em>sendmail<\/em>, y los <em>exploits<\/em>.<\/p>\n\n\n\n<p>El lector debe saber que el <em>buffer<\/em> no es m\u00e1s que un bloque contiguo de memoria de computadora que mantiene varias instancias del mismo tipo de datos, tambi\u00e9n conocido en el mundo de la programaci\u00f3n como listas secuenciales, matrices o <em>arrays<\/em>. Los <em>arrays<\/em>, como todas las variables, pueden ser declarados tanto est\u00e1ticos como din\u00e1micos. Las variables est\u00e1ticas son asignadas a la pila en tiempo de ejecuci\u00f3n.<\/p>\n\n\n\n<p><em>Overflow<\/em> es inundar, machacar o sobrepasar el l\u00edmite de algo. Por lo que <em>Buffer Overflow<\/em> se puede interpretar como el desborde o la superposici\u00f3n de c\u00f3digos\/datos en memoria, que se produce cuando se llena un segmento continuo de memoria con m\u00e1s elementos del requerido, provocando as\u00ed la sobrescritura de c\u00f3digos\/datos ajenos a los permitidos en el proceso.<\/p>\n\n\n\n<p>En este escrito nos centraremos m\u00e1s en el <em>Stack Overflow<\/em> o desbordamiento de pila, que de seguro es un t\u00e9rmino bastante conocido u o\u00eddo por ustedes; pero lo que no saben es que \u00e9ste puede producir m\u00e1s efectos colaterales que el s\u00f3lo hecho de sobrescribir c\u00f3digo.<\/p>\n\n\n\n<p>Hagamos un an\u00e1lisis simple y general de c\u00f3mo funciona la memoria en la PC.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Organizaci\u00f3n de la memoria:<\/h2>\n\n\n\n<p>Para entender c\u00f3mo funcionan los <em>Stack Overflow<\/em> deberemos entender primero c\u00f3mo es organizado un proceso en memoria. Los procesos son divididos en tres regiones: TEXT, DATA, y STACK. Nos centraremos en regi\u00f3n de STACK o m\u00e1s conocida como pila. Pero no seamos perezosos, primero veamos una peque\u00f1a vista de las otras regiones.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"517\" height=\"254\" src=\"https:\/\/hackcuba.net\/wp-content\/uploads\/2026\/03\/0x660019.png\" alt=\"\" class=\"wp-image-309\" srcset=\"https:\/\/hackcuba.net\/wp-content\/uploads\/2026\/03\/0x660019.png 517w, https:\/\/hackcuba.net\/wp-content\/uploads\/2026\/03\/0x660019-300x147.png 300w\" sizes=\"auto, (max-width: 517px) 100vw, 517px\" \/><\/figure>\n\n\n\n<p><strong>TEXT:<\/strong><br>La regi\u00f3n TEXT es ajustada por el programa e incluye c\u00f3digo (instrucciones). Esta regi\u00f3n corresponde a la secci\u00f3n TEXT del archivo ejecutable. Cualquier intento de escribir en ella resulta una violaci\u00f3n de segmentaci\u00f3n, ya que sus datos son declarados s\u00f3lo-lectura; algo as\u00ed como protegidos por el sistema.<\/p>\n\n\n\n<p><strong>DATA:<\/strong><br>La regi\u00f3n contiene datos inicializados y sin inicializar. Las variables est\u00e1ticas (<em>static<\/em>: su valor perdura durante la ejecuci\u00f3n de todo el programa) son guardadas aqu\u00ed. La regi\u00f3n DATA corresponde a la secci\u00f3n <em>data-bss<\/em> de los ejecutables. Su tama\u00f1o es agrandable con la instrucci\u00f3n de c\u00f3digo C: <code>system call brk(2)<\/code> y, si el crecimiento de \u00e9ste o del STACK agota la memoria disponible, el proceso es repaginado para ejecutarse otra vez, pero con un espacio de memoria mayor (como se muestra en la figura). Quiere decir que esta vez hay m\u00e1s memoria entre los segmentos DATA y STACK para que \u00e9stos puedan seguir creciendo (El segmento DATA crece hacia abajo y el STACK hacia arriba).<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"670\" height=\"382\" src=\"https:\/\/hackcuba.net\/wp-content\/uploads\/2026\/03\/0x660020.png\" alt=\"\" class=\"wp-image-310\" srcset=\"https:\/\/hackcuba.net\/wp-content\/uploads\/2026\/03\/0x660020.png 670w, https:\/\/hackcuba.net\/wp-content\/uploads\/2026\/03\/0x660020-300x171.png 300w\" sizes=\"auto, (max-width: 670px) 100vw, 670px\" \/><\/figure>\n\n\n\n<p><strong>STACK:<\/strong><br>Una pila o STACK no es m\u00e1s que una array que tiene como propiedad principal que sus elementos se insertan del modo LIFO, que significa que el primer elemento que entra ser\u00e1 el \u00faltimo en salir. Es algo que desde el punto de vista l\u00f3gico usamos diariamente para colocar elementos uno encima del otro y llamamos pila.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfPara qu\u00e9 se usan las pilas en los programas?<\/h2>\n\n\n\n<p>La t\u00e9cnica m\u00e1s empleada por los lenguajes de alto nivel de la actualidad es la funci\u00f3n o procedimiento. Desde el punto de vista interno de un programa, una llamada a una funci\u00f3n (<em>procedure call<\/em>), altera el flujo de control tal como un <em>jump<\/em> (salto) lo hace; pero a diferencia de \u00e9ste, la funci\u00f3n retorna el control a la posici\u00f3n siguiente desde donde fue llamado, conservando los valores de los registros de la m\u00e1quina (AX, BX, ZF, etc.)<\/p>\n\n\n\n<p>Este cambio s\u00f3lo es perceptible cuando se trabaja a bajo nivel -o sea, en ensamblador-, donde cuando se hace un salto a una funci\u00f3n primero se hace PUSH a los registros y estos se guardan en la pila y se recobran cuando se sale del procedimiento, y \u00e9ste antes de salir hace POP. Adem\u00e1s de registros en la programaci\u00f3n de alto nivel, el STACK es usado en tiempo de ejecuci\u00f3n para pasar par\u00e1metros a las funciones y devolver valores.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La regi\u00f3n STACK:<\/h2>\n\n\n\n<p>Como ya dijimos, un STACK es, entre otras cosas, un bloque contiguo de memoria conteniendo datos. Existe un registro llamado STACK POINTER (puntero de pila) cuyo nombre clave es SP, que apunta al tope del STACK. El fondo de la pila est\u00e1 en una direcci\u00f3n ajustada a su tama\u00f1o, es ajustado din\u00e1micamente por el Sistema Operativo en tiempo de ejecuci\u00f3n, cuando la CPU implementa instrucciones para hacer PUSH (introducir) y POP (sacar) al STACK.<\/p>\n\n\n\n<p>El STACK consiste en <em>frames<\/em> l\u00f3gicos de STACK (cuadros), que son \u00abpusheados\u00bb cuando se llama a una funci\u00f3n y \u00abpopeados\u00bb cuando se sale de \u00e9sta. Un STACK FRAME contiene los par\u00e1metros para una funci\u00f3n, sus variables locales y los datos necesarios para recuperar el STACK FRAME previo, incluyendo el valor del puntero de instrucci\u00f3n (IP: apunta a la zona de memoria donde est\u00e1 la instrucci\u00f3n a ejecutar por el microprocesador) que permite ubicarnos en la posici\u00f3n siguiente a la llamada (IP+1).<\/p>\n\n\n\n<p>Dependiendo de la implementaci\u00f3n, el STACK podr\u00e1 decrecer (detr\u00e1s de las direcciones m\u00e1s altas de memoria) o crecer. En nuestros ejemplos usaremos un STACK que decrece, ya que suponemos que estamos trabajando con un procesador Intel Pentium y as\u00ed es c\u00f3mo procede la pila en este, as\u00ed como en otros como SPARC, MIPS y MOTOROLA.<\/p>\n\n\n\n<p>El STACK POINTER (SP) puede apuntar a cualquier zona de la pila, e incluso a la siguiente direcci\u00f3n libre despu\u00e9s de \u00e9sta. Durante el texto tomaremos como punto de referencia un SP que apunta a la \u00faltima direcci\u00f3n del STACK (donde est\u00e1 el inicio de la pila).<\/p>\n\n\n\n<p>Adem\u00e1s del SP, necesitaremos un FRAME POINTER (FP), o puntero de cuadro, que como su nombre lo indica, permite a partir de \u00e9l, acceder a un <em>frame<\/em> que contenga un elemento \u00abpusheado\u00bb<em> (<\/em>par\u00e1metros y variables locales de la funci\u00f3n<em>)<\/em>, mediante un desplazamiento. Es por ello que es llamado en algunas referencias bibliogr\u00e1ficas como LOCAL BASE POINTER (LB) o puntero base local. Su importancia radica en que &nbsp;las variables locales pueden ser referenciadas mediante sus <em>offsets<\/em>, ya que sus distancias a FP no cambian con POPs y PUSHs. Muchos de ustedes que conoce del lenguaje de ensamblador de los procesadores Intel x86 pensar\u00e1n: \u00bfd\u00f3nde est\u00e1 ese registro FP, que yo no lo conozco? Pues no lo busquen, puesto que aqu\u00ed FP es un registro que usaremos para hacer referencia a su funcionamiento; podr\u00edamos llamarlo un registro <em>l\u00f3gico<\/em>, por lo que para almacenar su valor, entre otras cosas, usaremos otro registro que s\u00ed existe y es muy usado en el mundo del ensamblador, un registro auxiliar&nbsp; para referenciar a datos en memoria, como son variables, arreglos y par\u00e1metros, muy similar a un puntero com\u00fan de C. Me refiero al BASE POINTER (BP). Este puntero se usar\u00e1 principalmente para acceder a las variables locales y procedimientos porque, a diferencia del SP, sus <em>offsets<\/em> no var\u00edan con respecto a \u00e9l con PUSHs y POPs.<\/p>\n\n\n\n<p>La primera cosa que hace la m\u00e1quina cuando se&nbsp; llama a un procedimiento es guardar el FP (muchas veces como en los ejemplos que usaremos usan el BP) previo, \u00a1piensa por qu\u00e9! Pues para ser restaurado a la salida del procedimiento. Luego copia el actual SP hacia el BP (haci\u00e9ndolo el nuevo puntero FP) para apuntar a las variables locales de la funci\u00f3n, detr\u00e1s de el quedar\u00eda el SP guardado y los par\u00e1metros de la funci\u00f3n. Luego se asigna espacio para las variables locales restando a SP el tama\u00f1o total de las variables. A la salida del procedimiento, el STACK debe poder recuperar su FP guardado y las variables locales de la funci\u00f3n ya no estar\u00e1n en \u00e9l.<\/p>\n\n\n\n<p>Muchos de estos registros, en vez de registros, los ver\u00e1n escritos con una <em>e<\/em> delante (ej: <em>ebp<\/em>, <em>esp<\/em>, etc.) porque sin la <em>e<\/em> se refieren m\u00e1s bien a las versiones de 16 bits de los procesadores, y la <em>e<\/em> se refiere a registros de 32 bits.<\/p>\n\n\n\n<p>Escrito por Eliux [<a href=\"mailto:aorozco@infomed.sld.cu\">aorozco@infomed.sld.cu<\/a>]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Stack Overflow, Buffer Overflow o \u00abromper la pila\u00bb es una de las t\u00e9cnicas m\u00e1s usadas por los hackers<\/p>\n","protected":false},"author":2,"featured_media":311,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14,36],"tags":[111,92,4,38],"class_list":["post-308","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-hacking","category-proyecto-blackhat","tag-buffer-overflow","tag-hacker","tag-hacking","tag-proyecto-blackhat"],"_links":{"self":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/308","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=308"}],"version-history":[{"count":1,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/308\/revisions"}],"predecessor-version":[{"id":312,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/posts\/308\/revisions\/312"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=\/wp\/v2\/media\/311"}],"wp:attachment":[{"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=308"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=308"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hackcuba.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=308"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}