2012-03-22 72 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)而没有改变数值结果。