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
CVE-2019-25485 — Desbordamiento de búfer basado en pila en R 3.4.4. Explotación completa en x86, pero solo control de RIP con análisis de gadgets en x64 debido a restricciones del programa. La misma vulnerabilidad en dos arquitecturas, lo que lleva a diferentes rutas de explotación. | Kitploit
Herramientas/GitHubGitHub/themalwareguardian/cve-2019-25485
Análisis de VulnerabilidadesExplotaciónIngeniería InversaShellcodeDepuradoresAprendizaje y EducaciónDesarrollo de PayloadsExplotación de Binarios
GitHub
themalwareguardian/cve-2019-25485

CVE-2019-25485

Desbordamiento de búfer basado en pila en R 3.4.4. Explotación completa en x86, pero solo control de RIP con análisis de gadgets en x64 debido a restricciones del programa. La misma vulnerabilidad en dos arquitecturas, lo que lleva a diferentes rutas de explotación.

Ver Repositorio
3hace 5 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

🐞 CVE-2019-25485: R 3.4.4 - Desbordamiento de Búfer Basado en Pila (x86 y x64)

Desbordamiento de búfer basado en pila en R 3.4.4. Explotación completa en x86, pero solo control de RIP con análisis de gadgets en x64 debido a restricciones del programa. La misma vulnerabilidad en dos arquitecturas, lo que conduce a diferentes rutas de explotación.




📑 Índice de contenido

  • Por qué existe este repositorio
  • Por qué esta vulnerabilidad es interesante
  • Contexto y software afectado
  • Acerca de la vulnerabilidad
  • Desencadenar el fallo
  • Explotación



🎓 Por qué existe este repositorio

Este repositorio es parte del material que utilizo cuando enseño explotación de corrupción de memoria (además de mi trabajo habitual, también enseño en diferentes cursos de ciberseguridad donde ayudo a formar a la próxima generación de ingenieros inversos).

CVE-2019-25485 es el caso que uso cuando quiero que los estudiantes trabajen con la misma vulnerabilidad en dos arquitecturas diferentes y vean de primera mano qué cambia entre ellas. R 3.4.4 se distribuye tanto en versiones x86 como x64, y el mismo desbordamiento exacto existe en ambas, el mismo campo GUI, el mismo manejador de entrada, el mismo fallo. Ambos están documentados y explotados aquí como ejercicios separados:

  • La versión x86 sigue la metodología clásica de sobrescritura de EIP. El desbordamiento alcanza EIP, se encuentra un gadget JMP ESP en un módulo sin ASLR, se coloca shellcode después de la sobrescritura de EIP y se logra una reverse shell funcional. Es un exploit limpio y directo que demuestra los fundamentos de los desbordamientos de búfer basados en pila.
  • La versión x64 alcanza el control de RIP y confirma el offset, pero no se logra RCE completa. Esto es deliberado y es el punto del ejercicio. El intento de explotación en x64 documenta el proceso de búsqueda de gadgets en su totalidad, analiza por qué cada categoría de gadget falla en este contexto específico, explica la restricción de byte nulo impuesta por el manejador de entrada y describe la estructura de la cadena ROP que sería necesaria para eludir DEP y por qué no se puede construir dadas las restricciones de este vector de entrada. El único camino teórico restante para la explotación completa a partir de esta única vulnerabilidad sería JOP, Programación Orientada a Saltos, que encadena gadgets que terminan en JMP en lugar de RET y no depende de la pila para el flujo de control. Construir una cadena JOP manualmente sin ninguna región controlable escribible después de la sobrescritura de RIP es un desafío abierto avanzado que va más allá del alcance de este ejercicio. El fallo no es una brecha en la metodología. Es la lección.



💡 Por qué esta vulnerabilidad es interesante

R 3.4.4 es una aplicación de computación estadística, no un servicio de red o un navegador. El desbordamiento se desencadena a través de un campo GUI de escritorio, lo que significa que la superficie de ataque es completamente diferente de cualquier otro caso que enseño. Lo que hace que este caso sea útil para la enseñanza:

  • Sin componente de red. La carga útil se pega en un campo GUI, lo que introduce una clase diferente de restricciones, en particular cómo el manejador de entrada GUI procesa los bytes antes de que lleguen a la operación de copia vulnerable.
  • El control de RIP está confirmado. El desbordamiento alcanza RIP y se encuentra el offset. No es un caso donde no se pueda alcanzar la vulnerabilidad. El control del puntero de instrucción está completamente demostrado.
  • La aplicación de direcciones canónicas rompe el enfoque clásico. En x86 sobrescribes EIP y añades shellcode. En x64, los bytes superiores de RIP deben ser \x00\x00 para que la dirección sea canónica, y esos bytes nulos terminan la entrada inmediatamente después de la dirección del gadget. No hay espacio para shellcode o valores de cadena ROP después de la sobrescritura.
  • La conversión de byte nulo bloquea ROP. El campo GUI convierte los bytes nulos en espacios antes de copiar al búfer. Cada dirección x64 contiene bytes nulos en la mitad superior. Ninguna dirección de gadget puede colocarse en la pila como valor de cadena ROP, todas llegan corruptas.
  • DEP bloquea la ejecución directa. Incluso si se encontrara una manera de alcanzar el búfer de shellcode, DEP está habilitado y bloquea la ejecución en la pila.
  • La búsqueda de gadgets está documentada en su totalidad. El proceso de volcar gadgets de cada módulo cargado, filtrar por tipo y razonar por qué cada gadget falla está documentado paso a paso. Esta es la habilidad central que todo desarrollador de exploits necesita.
  • El esqueleto de la cadena ROP para VirtualProtect está explicado. Los estudiantes ven exactamente lo que se necesitaría para eludir DEP, por qué la convención de llamada importa y por qué esta cadena específica no se puede construir dadas las restricciones de entrada.



🔍 Contexto y software afectado

R es un entorno de computación estadística y gráficos disponible para Windows, macOS y Linux. La vulnerabilidad está en el diálogo de Preferencias GUI, específicamente en el campo Idioma para menús y mensajes, que copia la entrada del usuario en un búfer de pila de tamaño fijo sin validar su longitud.

Detalles técnicos clave:

  • Tipo de vulnerabilidad: Desbordamiento de búfer basado en pila
  • Versión afectada: R 3.4.4 x86_x64
  • Punto final afectado: Editar -> Preferencias GUI -> Idioma para menús y mensajes
  • Componente vulnerable: Manejador de entrada de preferencias GUI
  • Autenticación requerida: No (aplicación local)
  • Impacto: x86 - Ejecución remota de código | x64 - Flujo de control confirmado



⚠️ Acerca de la vulnerabilidad

R 3.4.4 procesa el campo Idioma para menús y mensajes copiando la cadena suministrada en un búfer de pila de tamaño fijo sin verificar su longitud. Una versión simplificada de la lógica vulnerable se ve así:

root@kitploit:~
char language_buffer[256];

strcpy(language_buffer, user_input);

Enviar una cadena suficientemente larga hace que la copia escriba más allá del final del búfer, corrompiendo la pila hasta que la dirección de retorno guardada se sobrescribe. Cuando la función retorna, la CPU carga el valor controlado por el atacante desde la pila en RIP e intenta saltar a él.

En x64, Windows impone la validación de direcciones canónicas antes de que se realice cualquier salto. Un valor no canónico como 0x4141414141414141 desencadena una violación de acceso inmediata antes de que se cargue RIP, lo que significa que el fallo se ve diferente de x86, sin un RIP limpio = 4141414141414141. El offset debe encontrarse leyendo el patrón cíclico de la pila después del fallo en lugar de directamente desde RIP.

Descargar herramienta



💥 Desencadenar el fallo

El fallo se puede reproducir pegando una cadena larga en el campo de idioma. No se requiere autenticación. Ejemplo usando Python para generar la carga útil:

root@kitploit:~
import struct

payload = b'A' * 400

with open('payload.txt', 'wb') as f:
	f.write(payload)
root@kitploit:~
Abrir R 3.4.4 x64
Editar -> Preferencias GUI
Pegar el contenido de payload.txt en Idioma para menús y mensajes
Hacer clic en Aceptar



💣 Explotación

El objetivo de este repositorio no es solo demostrar el fallo, sino recorrer el proceso completo de explotación en ambas arquitecturas, documentando qué funciona en x86, qué falla en x64 y, más importante, por qué.

Para mantener el README principal limpio, las notas detalladas de explotación, scripts y pasos del depurador se colocan dentro de la carpeta Vulnerability 📂 de este repositorio, organizados en subcarpetas separadas para x86 y x64.

Allí encontrarás el flujo de trabajo completo para ambas arquitecturas:

x86 - Explotación completa:

  • Fuzzing del campo de idioma para identificar el fallo.
  • Descubrimiento del offset para localizar la posición exacta de EIP en la pila.
  • Análisis de caracteres malos para identificar bytes que corrompen la carga útil.
  • Localización de un gadget JMP ESP en stats.dll, un módulo compilado sin ASLR ni SafeSEH.
  • Colocación y ejecución de shellcode, se logra una reverse shell completa.

x64 - Control de RIP y análisis de explotación:

  • Configuración de x64dbg para evitar interrupciones constantes de eventos de carga de DLL.
  • Fuzzing del campo de idioma en tres fases para encontrar el tamaño exacto del fallo.
  • Encontrar el offset de RIP leyendo el patrón cíclico de la pila en lugar de desde RIP.
  • Confirmar el control de RIP usando una sobrescritura de 6 bytes con relleno automático de bytes nulos.
  • Identificar la conversión de byte nulo a espacio como la restricción fundamental de entrada.
  • Volcar gadgets de todos los módulos R cargados usando rp++ y filtrar con PowerShell.
  • Analizar cada categoría de gadget, CALL RBX, CALL RSP, POP RSP, SUB RSP, PUSH RSP, y documentar por qué cada una falla en este contexto específico.
  • Explicar la estructura de la cadena ROP necesaria para llamar a VirtualProtect y eludir DEP, y por qué no se puede construir dada la restricción de byte nulo.
  • Documentar JOP como el único camino teórico restante y por qué sigue siendo un desafío abierto.