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 - 这是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
UNIX shell 脚本中的“#!/bin/sh”行是啥意思?