No se puede ejecutar Shellcode en la pila sin DEP

0

Este es el ejemplo más simple para mostrar mi problema. Todo está en WinXp sp3 con DEP deshabilitado.

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;
}

Esto terminó con un error:

(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=????????

Pero si ejecuto el shellcode directamente, funciona:

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)();
}

Esto funcionará bien.

Hice un seguimiento de la ejecución en los dos casos anteriores. Y en ambos casos, EIP aterrizó con éxito en el área de NOPs y continuó la ejecución. Pero no sé por qué falló el primer caso.

Una de las conjeturas es que en el primer caso, cuando f () regresa a 0x0012fbf0, el código de shell en el área fuera del marco de la pila (es decir, en ese punto, el ESP está debajo del área SHELLCODE).

Cualquiera puede dar una idea de por qué falló el primer caso?

    
pregunta user15580 19.07.2015 - 03:51
fuente

0 respuestas

Lea otras preguntas en las etiquetas