Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
windows-x86-shellcode-poc — Windows x86 PoC: desbordamiento de búfer basado en pila con shellcode personalizado en Windows 32-bit heredado. | Kitploit
Herramientas/GitHubGitHub/nataliadiak/windows-x86-shellcode-poc
Análisis de VulnerabilidadesIngeniería InversaShellcodeAprendizaje y EducaciónDesarrollo de PayloadsExplotación de Binarios
GitHubnataliadiak/windows-x86-shellcode-poc

windows-x86-shellcode-poc

Windows x86 PoC: desbordamiento de búfer basado en pila con shellcode personalizado en Windows 32-bit heredado.

Ver Repositorio
822hace 3 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Windows x86 Buffer Overflow PoC para Principiantes

Este es un tutorial simple y autocontenido sobre exploits de desbordamiento de búfer basados en la pila para Windows de 32 bits. No se necesitan guías externas: todo lo que necesitas está aquí.

¿Qué es este repositorio?

  • vulnerable.c: Un programa simple con una función gets() insegura.
  • messageBox.asm: Un pequeño payload en ensamblador que se ejecutaría después del desbordamiento.
  • exploit.c: Un ejemplo de cómo se podría desencadenar el desbordamiento.

Este proyecto enseña una idea central: la lectura insegura de entrada puede permitir a un atacante sobrescribir la dirección de retorno y redirigir la ejecución.

La Vulnerabilidad: gets() no tiene límite de tamaño

En vulnerable.c, el programa hace esto:

root@kitploit:~
char buffer[32];
gets(buffer);

El programa reserva 32 bytes para buffer, luego llama a gets() para leer la entrada. El problema: gets() no verifica el tamaño del búfer. Sigue leyendo caracteres hasta que encuentra una nueva línea. Si el usuario escribe 40 o 50 caracteres, los caracteres extra se desbordan más allá del búfer de 32 bytes.

Cómo se organiza la memoria en la pila

Cuando se ejecuta una función en C, la pila (una región de memoria) almacena:

  1. Variables locales (como buffer)
  2. El EBP guardado (puntero base de la función que llama)
  3. La dirección de retorno guardada (a dónde debe saltar la CPU cuando la función retorna)

Visualízalo así:

root@kitploit:~
Direcciones bajas (parte superior de la pila tal como se dibuja)
[  buffer (32 bytes)  ]
[    EBP guardado (4 bytes)     ]
[  dirección de retorno (4 bytes)  ]
Direcciones altas (parte inferior)

Cuando gets() desborda buffer con demasiada entrada, los bytes extra sobrescriben el EBP guardado y luego la dirección de retorno.

Si construimos cuidadosamente el desbordamiento para colocar una dirección específica en el campo de la dirección de retorno, la CPU saltará a esa dirección cuando la función intente retornar.

Cómo funciona el exploit: Paso a paso

  1. El programa se inicia y asigna buffer[32] en la pila.
  2. Llama a gets(buffer) para leer una línea de entrada del usuario.
  3. Enviamos una cadena que es más larga de 32 bytes (por ejemplo, 50 bytes).
  4. gets() no tiene verificación de tamaño, por lo que escribe los 50 bytes en el búfer.
  5. Los 18 bytes extra se desbordan más allá de buffer y sobrescriben el EBP guardado y la dirección de retorno.
  6. Construimos cuidadosamente el desbordamiento para que la dirección de retorno apunte al shellcode en la pila.
  7. Cuando la función retorna, la CPU lee la dirección de retorno sobrescrita.
  8. La CPU salta al shellcode.
  9. El shellcode se ejecuta con los permisos del programa.

Esta es la forma más simple de ejecución de código a través de un desbordamiento de búfer.

Qué sucede en el shellcode: El payload

messageBox.asm es una pequeña pieza de código diseñada para ejecutarse después del desbordamiento.

Hace lo siguiente:

  1. Cargar USER32.DLL: Llama a LoadLibraryA con la cadena "USER32.DLL" para asegurarse de que la biblioteca esté en memoria.
  2. Preparar argumentos para MessageBoxA: Coloca cuatro argumentos en la pila (identificador de ventana, texto del mensaje, título, tipo de botón).
  3. Llamar a MessageBoxA: Llama a la función API de Windows para mostrar un cuadro de mensaje con el texto "CAN I HACK THE PC?".
  4. Salir limpiamente: Llama a ExitProcess para terminar el programa de manera segura.

El punto clave: este es código ejecutable que se ejecuta después de que el desbordamiento redirige la ejecución hacia él. Cuando aparece el cuadro de mensaje en la pantalla, demuestra tres cosas:

  1. El desbordamiento de búfer funcionó y reescribió la dirección de retorno.
  2. La ejecución saltó al shellcode en la pila.
  3. El shellcode se ejecutó con éxito e hizo llamadas a la API de Windows.

En un ataque real, este payload podría hacer cualquier cosa: robar datos, crear un usuario, descargar malware, etc. El cuadro de mensaje es solo una forma visible y segura de demostrar que ocurrió la ejecución de código arbitrario.

Este payload específico utiliza direcciones de memoria hardcodeadas para MessageBoxA (0x751D8830) y ExitProcess (0x7437ADB0). Estas direcciones son específicas de un sistema. El payload tendría que ajustarse para una versión diferente de Windows o sistema.

MessageBoxA

Cómo compilar y ejecutar la demostración

Paso 1: Deshabilitar protecciones

Windows moderno tiene múltiples características de seguridad que previenen este exploit:

  • Stack Canaries (bandera GS): detectan sobrescrituras de la pila.
  • ASLR (DYNAMICBASE): aleatoriza las direcciones de memoria para que las direcciones hardcodeadas no funcionen.
  • DEP/NX (NXCOMPAT): marca la pila como no ejecutable para evitar la ejecución de código allí.

Para este ejercicio de aprendizaje, deshabilitamos todas.

Paso 2: Compilar en Windows

Usa MSVC (Microsoft Visual C++) con banderas específicas:

root@kitploit:~
cl /c /GS- /W3 /Zl vulnerable.c
link /SUBSYSTEM:CONSOLE /DYNAMICBASE:NO /NXCOMPAT:NO vulnerable.obj /OUT:vulnerable.exe

Significado de las banderas:

  • /GS- deshabilita la protección contra desbordamiento de búfer en la pila.
  • /DYNAMICBASE:NO deshabilita la aleatorización del diseño del espacio de direcciones (ASLR).
  • /NXCOMPAT:NO deshabilita DEP, permitiendo que el código en la pila se ejecute.

Si ya tienes el ejecutable, puedes deshabilitar protecciones con editbin:

root@kitploit:~
editbin /NXCOMPAT:NO /DYNAMICBASE:NO vulnerable.exe

Paso 3: Ejecutarlo

  1. Inicia vulnerable.exe.
  2. Cuando se te solicite, ingresa una cadena larga (más de 32 caracteres).
  3. Si el desbordamiento funciona, la dirección de retorno guardada se sobrescribe.
  4. El programa puede fallar, saltar a memoria aleatoria o (en un exploit real con shellcode adecuado) ejecutar el payload.

Por qué el README está completo

Este README explica:

  1. Qué es gets() y por qué es inseguro (sin límite de tamaño).
  2. Cómo la pila almacena variables locales, registros guardados y direcciones de retorno.
  3. Cómo un desbordamiento puede sobrescribir la dirección de retorno.
  4. Cómo la CPU usa la dirección de retorno cuando una función retorna.
  5. Cómo el shellcode puede ejecutarse cuando la dirección de retorno apunta a él.
  6. Qué protecciones existen y por qué las deshabilitamos.
  7. Cómo compilar y ejecutar el ejemplo.

Ahora entiendes todo el flujo del exploit de desbordamiento de búfer. Lee los archivos de código y compáralos con esta explicación para solidificar tu comprensión.

Aviso importante de seguridad

Este ejemplo es solo para aprendizaje. No uses esta técnica contra sistemas que no poseas o para los que no tengas permiso explícito de prueba. El acceso no autorizado a sistemas informáticos es ilegal.

Descargar herramienta