14

我有这段代码来测试一个shellcode,但我不明白,谁能给我解释一下?

忘记汇编shellcode,我想了解的是C代码,

char shellcode[] = "...";

int main(int argc, char **argv)

{

int (*func)();

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

(int)(*func)();

}

我的意思是一切,什么是空的(),请像向初学者解释一样解释它。

4

2 回答 2

16
int (*func)();

这是一个函数指针的声明。函数指针本质上是一个保存函数地址的变量。在这种情况下,func指向的函数类型是不带参数并返回int. 您可以将函数的地址分配给此变量,如下所示:

func = foo;

foo原型的函数在哪里int foo();

将函数分配给此变量后,您可以调用func指向的函数,如下所示:

(*func)();

有一种替代语法(等效),我认为它更清楚:

func();

因此,如果foo分配给func,那么上面的两个示例实际上都会调用该函数foo

您还可以将值转换为函数指针。在代码示例中

(int (*)())

是对不带参数并返回一个函数指针的强制转换int。这样编译器就不会抱怨将本质上是 a的内容分配char*给函数指针func

在您上面给出的代码中,还有最后一件事。在func被调用之后,结果(由于某种原因)被强制转换为int. 据我所知,这个演员阵容完全没有必要。所以最后一行

(int)(*func)();

可以替换为

(*func)();
于 2010-05-09T15:15:03.333 回答
3

int (*func)();是指向具有返回类型的函数的指针的定义intfunc = (int (*)()) shellcode;为函数指针分配一个地址shellcode[](汇编程序字节码,您的 CPU 执行的指令),(int)(*func)();通过其地址(汇编程序指令)调用函数,不传递任何参数,因为()已指定. 例如,汇编指令\x90有名称NOPN o Operation)并且什么都不做,其他汇编指令根据您执行它们的系统做不同的事情。

于 2010-05-09T14:51:27.173 回答