2012-03-22 153 views
15

我真的不得到這個代碼是如何做它做什麼:C中的shellcode - 這是什麼意思?

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

好吧,我知道:

int *ret; 

設置爲int的指針。 和:

ret = (int *)&ret + 2; 

設置的RET地址和2個字節(我認爲)

但我不明白這是什麼意思:

(int *)&ret 

我知道&ret手段,不是(int *)&ret的意思。 另外,它是如何通過將shellcode的值賦值爲ret來執行shellcode的?

UPDATE: 之間有什麼區別:

(int *)&ret + 2 

和:

&ret + 2 
+3

好奇爲什麼這麼多downvotes ... shellcode看起來很無害。 – FatalError 2012-03-22 03:39:26

回答

16

的 '串' shellcode包含某種形式的機器碼。

int *ret;定義變量ret,它是指向int的指針。

賦值ret = (int *)&ret + 2;使ret指向一個自己的實際位置(或地址)的大小爲兩個int的位置;這是堆棧中的地址,大概是函數的返回地址(main())存儲在堆棧中的地址。

分配*ret = (int)shellcode;分配殼代碼返回地址的地址。因此,當main()函數退出時,返回地址是shell代碼,它執行任何操作,而不是正常退出程序。

演員掩蓋了許多罪過。該代碼提出了大量不可移植的假設,這些假設在目標環境中可能是合理的,但不一定在其他任何地方。


有什麼區別:&ret+2(int *)&ret + 2

類型,主要是;這是前面提到的衆多罪過之一。 &ret具有類型int **(指針指向int)代替int *其爲ret本身的類型。由於所有實際機器上的sizeof(int *) == sizeof(int **),鑄造只是平靜了編譯器的投訴(關於指定錯誤類型的指針到ret)而沒有改變數值結果。