2012-03-22 14 views
15

nie jestem coraz jak ten kod robi to, co robi:Shellcode w C - Co to znaczy?

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

Ok, wiem:

int *ret; 

ustawia wskaźnik na int. oraz:

ret = (int *)&ret + 2; 

ustawia adres ret i 2 bajty (myślę).

Ale ja nie rozumiem, co to znaczy:

(int *)&ret 

wiem co &ret środki ale nie to, co oznacza (int *)&ret. Co więcej, w jaki sposób wykonuje się kod powłoki, przypisując wartość shellcode do ret?

UPDATE: Jaka jest różnica pomiędzy:

(int *)&ret + 2 

oraz:

&ret + 2 
+3

Ciekawe, dlaczego tak wiele pochlebstw ... shellcode wygląda całkiem nieszkodliwie. – FatalError

Odpowiedz

16

The 'string' shellcode zawiera jakiś kod maszynowy pewnego rodzaju.

Parametr int *ret; definiuje zmienną ret, która jest wskaźnikiem do int.

Przypisanie ret = (int *)&ret + 2; powoduje, że wskazuje na lokalizację o wielkości dwóch int z własnej faktycznej lokalizacji (lub adresu); jest to adres w stosie, przypuszczalnie tam, gdzie adres powrotu funkcji (main()) jest przechowywany na stosie.

Przypisanie *ret = (int)shellcode; powoduje przypisanie adresu kodu powłoki do adresu zwrotnego. Dlatego po wyjściu z funkcji main() adres zwrotny jest kodem powłoki, który robi wszystko, co robi, zamiast normalnie wyjść z programu.

Odlewy zasłaniają wiele grzechów. Kod tworzy dużą liczbę nieprzenośnych założeń, które są prawdopodobnie uzasadnione w środowisku docelowym, ale niekoniecznie w innym miejscu.


Jaka jest różnica pomiędzy: &ret+2 i (int *)&ret + 2?

Rodzaj, głównie; jest to jedna z wielu wspomnianych wcześniej grzechów. &ret ma typ int ** (wskaźnik do wskaźnika na int) zamiast int *, który sam jest typu ret. Od sizeof(int *) == sizeof(int **) na wszystkich rzeczywistych maszynach, obsada ogranicza się do zażalenia od kompilatora (dotyczącego przypisania niewłaściwego wskaźnika do ret) bez zmiany wyniku liczbowego.