yaklang/exploitación-de-cadena-de-formato
Manual de explotación de cadenas de formato. Úsalo cuando las funciones de la familia printf reciban cadenas de formato controladas por el usuario, permitiendo lecturas arbitrarias de la pila (%p/%s), escrituras arbitrarias en memoria (%n/%hn/%hhn), sobrescrituras de GOT/hook, y fugas de canary/libc/PIE.
Técnicas principales
- Lectura arbitraria de pila: Usa
%po%spara filtrar direcciones de retorno, canary o direcciones base de libc/PIE. - Escritura arbitraria de memoria: Emplea
%n,%hno%hhnpara modificar valores en GOT o variables objetivo. - Fugas de información: Combina lecturas para obtener canary, dirección de libc y PIE base.
- Sobrescritura de GOT: Redirige la ejecución reemplazando entradas de la tabla GOT.
Componentes del ecosistema
| Herramienta | Propósito |
|---|---|
| yaklang | Lenguaje de scripting para automatizar la explotación |
| GDB | Depuración y análisis dinámico |
| pwntools | Biblioteca Python para construcción de exploits |
| checksec | Verificación de protecciones (NX, PIE, RELRO) |
Flujo de trabajo típico
- Identificar la vulnerabilidad: Busca funciones printf sin cadena de formato fija (ej.
printf(user_input)). - Calcular offsets de pila: Usa
%prepetido para encontrar la posición de tu entrada en la pila. - Filtrar información: Extrae canary, dirección de libc y PIE base.
- Preparar escritura: Calcula direcciones objetivo (ej. puts@GOT) y valores a escribir.
- Ejecutar escritura: Usa
%hn/%hhnpara modificar memoria de forma controlada. - Obtener shell: Redirige ejecución a system("/bin/sh") o similar.
Ejemplo básico con yaklang
// Ejemplo de exploit de cadena de formato
vuln = openProcess("./vuln")
// Enviar payload para filtrar dirección
payload = "%7$p.%8$p.%9$p"
vuln.sendLine(payload)
resp = vuln.recvLine()
println("Respuesta: " + resp)
Referencias
- Documentación de yaklang: https://yaklang.io/docs
- pwntools: https://docs.pwntools.com
- OWASP Format String Attack: https://owasp.org/www-community/attacks/Format_string_attack