指针声明和函数调用中的奇数C语法

指针声明和函数调用中的奇数C语法,c,function-pointers,shellcode,C,Function Pointers,Shellcode,在有人建议使用cdecl工具之前,我已经尝试过了。奇怪的是,大多数查询语句返回时都带有语法错误警告 下面是我在网上找到的一个C程序,它只运行一段外壳代码 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char **argv) { char shellcode[] = "\xb0\x01\x31\xdb\xcd\x80"; int (*f

在有人建议使用cdecl工具之前,我已经尝试过了。奇怪的是,大多数查询语句返回时都带有语法错误警告

下面是我在网上找到的一个C程序,它只运行一段外壳代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv) {

char shellcode[] = "\xb0\x01\x31\xdb\xcd\x80";     

int (*func)();

func = (int (*)()) shellcode;
(int)(*func)();

return 0;

}
此语句将func声明为指向返回int的函数(由“()”表示)的指针(由“*”表示)

func = (int (*)()) shellcode;

此语句将外壳代码数组类型转换为指向函数(由“()”表示)的指针(由“(*)”表示),该函数返回int并将指针指定给func

(int)(*func)();
这个final语句执行指针func(由“(*func)”指向的函数(由“()”表示),并将结果类型转换为整数

我想这就是这里发生的事情。如果任何有C语言经验的人看到我的解释有任何错误,或者可以提供一个替代的或更具教育意义的解释,我非常欢迎你的意见

我从来没有写过这样的变量初始化或函数调用,所以我对所显示的语法仍然有些困惑。如果您有更可读的方法来编写上述代码,请同时提供输入


谢谢。

虽然我不明白为什么它会将返回值强制转换为int;我的怀疑是,即使是写这篇文章的人对C函数指针语法也不是很有信心

在现实世界中,您可能会看到使用typedef编写的代码:

typedef (*funcT)();
funcT func = (funcT) shellcode;
(*func)();

这似乎是对的,什么?首先,该代码甚至无法编译,因为字符串格式不正确。其次,如果没有某种分段错误,代码是不可能运行的。这是因为:a。您正在数据空间中执行代码。B“代码”是垃圾。这不是真正的代码。我模糊了实际的外壳代码(如“…”所示)。程序编译成功,但确实导致seg故障。正如您所知,一旦外壳代码被执行,它会将某些CPU寄存器设置为特定值,然后在GDB中检查时会显示某些信息。我无法透露外壳代码的用途。是的,这也是我见过的最糟糕的指针用法;因此要求更多的专家输入。@thang,
我模糊了实际的外壳代码“此语句将外壳代码数组类型转换为指针”-您忘记(或没有提到)数组指针衰减;正在转换的值是数组中第一个字符的地址。我还不明白为什么函数调用被类型转换为int,而在声明和赋值func之后,这应该是不必要的。我假设
(int)
用于禁止编译器警告未使用的expession@MattMcNabb在这种情况下,惯用的方法是将其作废。
typedef (*funcT)();
funcT func = (funcT) shellcode;
(*func)();