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

15

我不太明白这段代码是如何实现它的:

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;

设置一个指向整数的指针。

ret = (int *)&ret + 2;

设置ret的地址和2个字节(我想是指长度)。

但我不明白这是什么意思:

(int *)&ret

我知道&ret的含义,但不知道(int *)&ret的含义。另外,将shellcode的值赋给ret后,它是如何执行shellcode的?

更新: 以下两者有什么区别:

(int *)&ret  + 2

并且:

&ret + 2

3
为什么会有这么多踩的呢?这个shellcode看起来挺无害的。 - FatalError
如果我运行这个会发生什么?这是恶意软件吗? - undefined
1个回答

17

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

int *ret;定义了一个指向int的指针变量ret

赋值语句ret = (int *)&ret + 2;使得ret指向比它本身实际位置(或地址)大两个int的位置。这是堆栈中存放返回函数(main())地址的地方。

赋值语句*ret = (int)shellcode;将shell code的地址赋给了返回地址。因此,当main()函数退出时,返回地址是shell code,而不是正常退出程序。

强制类型转换掩盖了许多问题。该代码进行了许多非可移植假设,在目标环境上可能是合理的,但不一定在其他地方也是如此。


&ret+2(int *)&ret + 2之间有什么区别?

主要是类型不同;这是前面提到的许多问题之一。&ret的类型是int **(指向指针的指针),而不是ret本身的int *类型。由于对于所有实际机器sizeof(int *) == sizeof(int **),所以强制类型转换只是消除了编译器关于向ret赋不正确类型指针的投诉,而没有改变数值结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接