Impossibile eseguire lo shellcode nello stack senza DEP

0

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?

    
posta user15580 19.07.2015 - 03:51
fonte

0 risposte

Leggi altre domande sui tag