我并没有真正了解这段代码的作用:
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 shellcode来ret?
更新:有什么区别:
(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)而不改变数值结果.