C中的外壳代码-这意味着什么?

C中的外壳代码-这意味着什么?,c,shellcode,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) =

我不太明白这段代码是如何做到的:

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的地址和2个字节(我想)

但我不明白这意味着什么:

(int *)&ret
我知道
&ret
的意思,但不知道
(int*)&ret
的意思。 另外,它如何通过将
shellcode
的值分配给
ret
来执行外壳代码

更新: 以下两者之间的区别是什么:

(int *)&ret  + 2
以及:


“字符串”
shell代码
包含某种类型的机器代码

int*ret
定义变量
ret
,该变量是指向
int
的指针

赋值
ret=(int*)&ret+2
使
ret
从其自身的实际位置(或地址)指向两个
int
大小的位置;这是堆栈中的一个地址,可能是函数(
main()
)的返回地址存储在堆栈中的位置

赋值
*ret=(int)外壳代码将外壳代码的地址分配给返回地址。因此,当
main()
函数退出时,返回地址是shell代码,它执行任何操作,而不是正常退出程序

演员们掩盖了许多罪恶。代码做出了大量不可移植的假设,这些假设可能在目标环境中是合理的,但不一定在其他任何地方


有什么区别:
&ret+2
(int*)&ret+2


类型,主要是;这是前面提到的众多罪恶之一
&ret
的类型是
int**
(指针指向
int
),而不是
int*
,后者是
ret
本身的类型。由于在所有实际的机器上都是
sizeof(int*)==sizeof(int**)
,演员们只是平息了编译器的抱怨(关于将错误类型的指针分配给
ret
),而没有改变数值结果。

奇怪为什么这么多人投了反对票。。。外壳代码看起来很无害。
(int *)&ret  + 2
&ret + 2