我有这段代码用于测试shellcode,但是我不理解它,能否有人给我解释一下?
忘掉汇编shellcode,我想理解的是C代码。
char shellcode[] = "...";
int main(int argc, char **argv)
{
int (*func)();
func = (int (*)()) shellcode;
(int)(*func)();
}
我是指什么都包括,那个空的()
,请像向初学者解释一样解释它。我有这段代码用于测试shellcode,但是我不理解它,能否有人给我解释一下?
忘掉汇编shellcode,我想理解的是C代码。
char shellcode[] = "...";
int main(int argc, char **argv)
{
int (*func)();
func = (int (*)()) shellcode;
(int)(*func)();
}
我是指什么都包括,那个空的()
,请像向初学者解释一样解释它。int (*func)();
这是一个函数指针的声明。函数指针本质上是保存函数地址的变量。在此情况下,func
指向的函数类型是一个不带参数并返回 int
的函数。您可以将一个函数的地址分配给这个变量,例如:
func = foo;
假设有一个原型为int foo();
的函数 foo
。
一旦将一个函数分配给该变量,您可以像这样调用指向func
的函数:
(*func)();
还有一种语法(等价的),我认为更清晰易懂:
func();
如果将foo
分配给func
,那么上面两个示例实际上都会调用函数foo
。
你还可以将值转换为函数指针。在代码示例中:
(int (*)())
这是将一个不带参数并返回 int
的函数指针强制转换,以避免编译器对将基本上是 char*
的值赋给函数指针 func
抱怨。
在你提供的代码中,还有一件事情。在调用 func
后,结果被(由于某种原因)强制转换为 int
。就我所知,这个强制转换是完全没有必要的。所以最后一行:
(int)(*func)();
可以被替换为
(*func)();
int (*func)();
是指向返回类型为 int
的函数的指针的定义,func = (int (*)()) shellcode;
将函数指针赋值为 shellcode[]
的地址(汇编字节码,即 CPU 执行的指令),(int)(*func)();
通过其地址(汇编指令)调用函数,因为指定了 ()
,没有传递任何参数。例如,汇编指令 \x90
的名称为 NOP
(N o Op eration),什么也不做,其他汇编指令根据所执行的系统而有所不同。
func = (int (*)()) shellcode;
告诉编译器函数代码从 shellcode[]
的第一个字节开始。但是你有一个只包含汇编代码的函数。由于每个C程序在编译后都会变成汇编代码,这不是问题,调用 (int)(*func)();
应该会执行你放在 shellcode[]
中的汇编指令。 - YasirA