2012-03-22 15 views
15

io non sono davvero ottenere come questo codice fa quello che fa:Shellcode in C - Cosa significa?

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

Va bene, lo so:

int *ret; 

imposta un puntatore di int. e:

ret = (int *)&ret + 2; 

imposta l'indirizzo di ret e 2 byte (credo.)

Ma non capisco che cosa questo significa:

(int *)&ret 

so che cosa significa ma &ret non quello che significa (int *)&ret. Inoltre, come si esegue lo shellcode assegnando il valore di shellcode a ret?

UPDATE: Qual è la differenza tra:

(int *)&ret + 2 

e:

&ret + 2 
+3

Curioso perché così tanti downvotes ... lo shellcode sembra abbastanza innocuo. – FatalError

risposta

16

Il 'stringa' shellcode contiene un codice macchina di qualche tipo.

Il int *ret; definisce una variabile ret che è un puntatore a un int.

L'assegnazione ret = (int *)&ret + 2; fa sì che ret punti in una posizione delle dimensioni di due int dalla propria posizione effettiva (o indirizzo); questo è un indirizzo nello stack, presumibilmente dove l'indirizzo di ritorno della funzione (main()) è memorizzato nello stack.

L'assegnazione *ret = (int)shellcode; assegna l'indirizzo del codice shell all'indirizzo di ritorno. Pertanto, quando si esce dalla funzione main(), l'indirizzo di ritorno è il codice shell, che fa tutto ciò che fa invece di uscire normalmente dal programma.

I calchi coprono una moltitudine di peccati. Il codice fa un gran numero di ipotesi non-portatili che sono probabilmente giustificate nell'ambiente di destinazione ma non necessariamente altrove.


Qual è la differenza tra: &ret+2 e (int *)&ret + 2?

Tipo, principalmente; questa è una delle moltitudini di peccati menzionate in precedenza. &ret ha il tipo int ** (puntatore al puntatore a int) invece di int * che è il tipo di ret stesso. Dal sizeof(int *) == sizeof(int **) su tutte le macchine reali, il cast si limita a sedare un reclamo dal compilatore (sull'assegnazione del tipo sbagliato di puntatore a ret) senza modificare il risultato numerico.