2012-03-22 14 views
15

Realmente no recibo cómo este código hace lo que hace:Shellcode en C - ¿Qué significa esto?

char shellcode[] = "\xbb\x00\x00\x00\x00"   
        "\xb8\x01\x00\x00\x00"     
        "\xcd\x80";     

int main() 
{ 
    int *ret; 
    ret = (int *)&ret + 2; 
    (*ret) = (int)shellcode; 
} 

bien, sé:

int *ret; 

establece un puntero de int. y:

ret = (int *)&ret + 2; 

establece la dirección de ret y 2 bytes (creo).

Pero no consiguen lo que esto significa:

(int *)&ret 

Sé lo &ret medios, pero no lo que significa (int *)&ret. Además, ¿cómo ejecuta el shellcode asignando el valor de shellcode al ret?

ACTUALIZACIÓN: ¿Cuál es la diferencia entre:

(int *)&ret + 2 

y:

&ret + 2 
+3

Curioso por qué tantos downvotes ... el shellcode parece bastante inofensivo. – FatalError

Respuesta

16

La 'cadena' shellcode contiene algo de código máquina de algún tipo.

El int *ret; define una variable ret que es un puntero a un int.

La asignación ret = (int *)&ret + 2; hace ret apunta a una ubicación del tamaño de dos int desde su propia ubicación real (o dirección); esta es una dirección en la pila, presumiblemente donde se almacena la dirección de retorno de la función (main()) en la pila.

La asignación *ret = (int)shellcode; asigna la dirección del código del shell a la dirección de retorno. Por lo tanto, cuando sale la función main(), la dirección de retorno es el código del shell, que hace lo que hace en lugar de salir del programa normalmente.

Los moldes cubren una multitud de pecados. El código hace una gran cantidad de supuestos no portátiles que probablemente estén justificados en el entorno objetivo, pero no necesariamente en ningún otro lado.


¿Cuál es la diferencia entre: &ret+2 y (int *)&ret + 2?

Tipo, principalmente; esta es una de la multitud de pecados mencionados anteriormente. &ret tiene el tipo int ** (puntero a puntero a int) en lugar de int * que es el tipo de ret. Desde sizeof(int *) == sizeof(int **) en todas las máquinas reales, el molde simplemente resuelve un problema del compilador (sobre la asignación del tipo incorrecto de puntero a ret) sin cambiar el resultado numérico.