gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:34:02 26 4
gpt4 key购买 nike

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

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的?

更新:有什么区别:

(int *)&ret  + 2

和:

&ret + 2

最佳答案

“字符串”shellcode 包含某种机器代码。

int *ret; 定义了一个变量 ret,它是一个指向 int 的指针。

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

赋值*ret = (int)shellcode;将shell代码的地址赋值给返回地址。因此,当main()函数退出时,返回地址是shell代码,它会做任何事情,而不是正常退出程序。

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


What's the difference between: &ret+2 and (int *)&ret + 2?

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

关于c - C 中的 Shellcode - 这是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9816059/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com