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