
Windows x86 PoC: desbordamiento de búfer basado en pila con shellcode personalizado en Windows 32-bit heredado.
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í.
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.
gets() no tiene límite de tamañoEn vulnerable.c, el programa hace esto:
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.
Cuando se ejecuta una función en C, la pila (una región de memoria) almacena:
buffer)EBP guardado (puntero base de la función que llama)Visualízalo así:
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.
buffer[32] en la pila.gets(buffer) para leer una línea de entrada del usuario.gets() no tiene verificación de tamaño, por lo que escribe los 50 bytes en el búfer.buffer y sobrescriben el EBP guardado y la dirección de retorno.Esta es la forma más simple de ejecución de código a través de un desbordamiento de búfer.
messageBox.asm es una pequeña pieza de código diseñada para ejecutarse después del desbordamiento.
Hace lo siguiente:
LoadLibraryA con la cadena "USER32.DLL" para asegurarse de que la biblioteca esté en memoria.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:
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.

Windows moderno tiene múltiples características de seguridad que previenen este exploit:
Para este ejercicio de aprendizaje, deshabilitamos todas.
Usa MSVC (Microsoft Visual C++) con banderas específicas:
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:
editbin /NXCOMPAT:NO /DYNAMICBASE:NO vulnerable.exe
vulnerable.exe.Este README explica:
gets() y por qué es inseguro (sin límite de tamaño).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.
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.