Joh*_*ith 1 c c++ void shellcode
我今天在一些fb配置文件中看到了这段代码,并且无法理解这是什么以及它是如何工作的: -
(*(void(*)()) shellcode)()
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下,上面的代码是什么意思?
下面的完整代码片段: -
#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;
}
Run Code Online (Sandbox Code Playgroud)
它是对函数指针的强制转换(没有返回结果且没有参数).我更喜欢typedef用来定义这些函数的签名:
typedef void plainsig_t(void);
Run Code Online (Sandbox Code Playgroud)
然后简单地编码
(*(plainsig_t*)shellcode) ();
Run Code Online (Sandbox Code Playgroud)
对于函数指针,您不需要取消引用它们,因此只需编写代码:
((plainsig_t*) shellcode) ();
Run Code Online (Sandbox Code Playgroud)
它基本上调用机器代码位于shellcode内存区域内的函数.
顺便说一句,这不是严格的可移植C.原则上,不能保证你可以将数据指针强制转换为函数指针.(在一些奇怪的处理器上 - 例如嵌入式微控制器,DSP,20世纪70年代的计算机 - ,代码和数据位于不同的地址空间,或者具有不同的指针大小等......).但是大多数常见的处理器和ABI(x86-64/Linux,ARM/Android,......)具有相同的代码和数据地址空间,并接受向数据指针的转换函数指针,反之亦然.
这是C和C++不同的地方.
在C中,它表示指向函数的指针,该函数返回void并获取未指定数量的未指定类型的参数.
在C++中,它表示指向返回void且不带参数的函数的指针.
表达式作为一个整体获取地址shellcode,将其转换为指向函数类型的指针,然后调用该函数 - 即,执行该字符串中的操作码.
void(*)()意思是“指向不带参数的 void 函数的指针”。线路
(*(void(*)()) shellcode)();
Run Code Online (Sandbox Code Playgroud)
正在转换shellcode为这样的函数指针,取消引用该指针(实际上不必要),然后调用该函数。
| 归档时间: |
|
| 查看次数: |
3466 次 |
| 最近记录: |