C中的Shellcode - 这是什么意思?

use*_*923 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;
}
Run Code Online (Sandbox Code Playgroud)

好的,我知道:

int *ret;
Run Code Online (Sandbox Code Playgroud)

设置int的指针.和:

ret = (int *)&ret + 2;
Run Code Online (Sandbox Code Playgroud)

设置ret的地址和2个字节(我想.)

但我不知道这意味着什么:

(int *)&ret
Run Code Online (Sandbox Code Playgroud)

我知道什么&ret意思但不(int *)&ret意味着什么.此外,它是如何通过分配的值执行的shellcode shellcoderet

更新:有什么区别:

(int *)&ret  + 2
Run Code Online (Sandbox Code Playgroud)

和:

&ret + 2
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 17

'string' shellcode包含某种类型的机器代码.

int *ret;定义变量ret这是一个指向int.

分配ret = (int *)&ret + 2;使得ret指向了两个大小int从自己的实际位置(或地址); 这是堆栈中的一个地址,大概是函数(main())的返回地址存储在堆栈中.

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

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


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

类型,主要; 这是前面提到的众多罪恶之一. &ret具有类型int **(指向指针的指针int)而不是int *ret自身的类型.因为sizeof(int *) == sizeof(int **)在所有实际的机器上,演员只是平息编译器的抱怨(关于指定错误类型的指针ret)而不改变数值结果.