C 中的 Shellcode - 这是啥意思?

Posted

技术标签:

【中文标题】C 中的 Shellcode - 这是啥意思?【英文标题】:Shellcode in C - What does this mean?C 中的 Shellcode - 这是什么意思? 【发布时间】:2012-03-22 03:30:18 【问题描述】:

我并没有真正了解这段代码是如何做到的:

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 看起来很无害。 【参考方案1】:

“字符串”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)而不改变数值结果。

【讨论】:

以上是关于C 中的 Shellcode - 这是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

C结构中的“:”(冒号) - 这是啥意思? [复制]

UNIX shell 脚本中的“#!/bin/sh”行是啥意思?

linux 命令中的sh是啥意思??

C语言中的冒号(:)是啥意思?

C语言中的“class”是啥意思啊?讲下其作用及用法。麻烦了

C中的“void (*f)(void)”是啥意思