Ecco l'esempio più semplice per mostrare il mio problema. Tutto è in WinXp sp3 con DEP disabilitato.
char f() {
// shellcode starting with some NOPs,
char shellcode[400]= {
0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
0x66, ... some basic shellcode here ... 0x30.
0xCC
};
// Overwriting Return address in stack to return to NOPs in shellcode above
b[404]=0xf0;
b[405]=0xfb;
b[406]=0x12;
b[407]=0x00;
}
Questo si è concluso con un errore:
(920.e7c): Illegal instruction - code c000001d (!!! second chance !!!)
eax=7c801d7b ebx=7c80262c ecx=7c801bfa edx=00060002 esi=00000000 edi=7c802654
eip=0012fc15 esp=0012ff08 ebp=7e410000 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
0012fc15 d9907ca5e490 fst dword ptr [eax-6F1B5A84h] ds:0023:0d64c2f7=????????
Ma se eseguo direttamente lo shellcode, funziona:
char f() {
// shellcode starting with some NOPs,
char shellcode[400]= {
0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90, 0x90,
0x66, ... some basic shellcode here ... 0x30.
0xCC
};
void *exec = shellcode;
((void(*)())exec)();
}
Funzionerà bene.
Ho tracciato l'esecuzione nei due casi precedenti. E in entrambi i casi, EIP è atterrato con successo nell'area dei NOP e continua l'esecuzione. Ma non so perché il primo caso è fallito.
Una delle ipotesi è che nel primo caso, quando f () ritorna a 0x0012fbf0, lo shellcode nell'area al di fuori del frame dello stack (cioè a quel punto, l'ESP è sotto l'area SHELLCODE).
Chiunque può dare un'idea del perché il primo caso è fallito?