我今天在一些fb个人资料中看到了此代码,但无法理解它是什么以及它是如何工作的:
(*(void(*)()) shellcode)()
有人可以解释一下,上面的代码是什么意思?
下面的完整代码段:-
#include <stdio.h>
#include <string.h>
char *shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69"
"\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";
int main(void)
{
fprintf(stdout,"Length: %d\n",strlen(shellcode));
(*(void(*)()) shellcode)();
return 0;
}
它是对函数指针的强制转换(没有返回结果,也没有参数)。我更喜欢使用typedef
定义此类功能的签名:
typedef void plainsig_t(void);
然后简单地编码
(*(plainsig_t*)shellcode) ();
对于函数指针,您不需要取消引用它们,因此,只需编写代码就会更短:
((plainsig_t*) shellcode) ();
它基本上会调用其机器代码位于shellcode
内存区域内的函数。
顺便说一句,这不是严格可移植的C。原则上,不能保证可以将数据指针转换为函数指针。(在某些奇怪的处理器上,例如嵌入式微控制器,DSP,1970年代的计算机上,代码和数据位于不同的地址空间中,或具有不同的指针大小,等等。)但是大多数常见的处理器和ABI(x86-64 / Linux,ARM / Android等)具有用于代码和数据的相同地址空间,并接受将函数指针转换为数据指针,反之亦然。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句