这段代码是什么意思?
char code[] = "bytecode will go here!";
int main(int argc, char **argv) {
int (*func)(); /* This is pointer to function */
func = (int (*)())code; /* What does this line mean? */
(int)(*func)(); /* Calling function by pointer */
}
答案 0 :(得分:3)
func = (int (*)()) code;
作为数组的 code
被隐式转换为指向其第一个元素的指针(它衰减到这样的指针)。然后将此指针强制转换为指向函数的指针。
此演员表会导致未定义的行为。但是大多数时候",它可能会导致一个指向数组地址的函数指针。当你调用它时,控制跳转到这个数组。如果它包含字符串数据,您很可能会得到无效的操作码或分段错误。但是,如果该数组包含一些用户输入,则恶意用户可以将(编译的)代码放入其中,执行各种有趣(或不太有趣)的内容。
作为一个例子,考虑在某种服务器上运行的上述代码,通过某些网站提供用户输入。然后可以用for example /bin/sh
替换该程序,从而在该服务器上获得shell访问权。
答案 1 :(得分:1)
您所看到的是type punning的一个例子。
void print_hello()
{
printf("hello");
}
int main()
{
void (*hello_func_ptr)() = &print_hello;
//we convert what the function points to to a string of "byte code"
char *func_byte_code = (char *)hello_func_ptr;
// prints out byte code of the function
printf(func_byte_code);
// we cast the string byte code to a function pointer
void (*func_from_byte_code)() = (void (*)())func_byte_code;
// we call the function we got from casting the byte code to a function pointer
(*func_from_byte_code)(); // prints "hello"!
return 0;
}
你的函数做的是取字节代码字符串并将其转换回函数指针,就像我们上面所做的那样。然后,您可以通过取消引用指针并通过添加括号和函数所需的任何参数来调用它来调用该函数。
当然,你不应该在常规编程中做这样的事情,但很少在特殊的情况下。
答案 2 :(得分:-1)
这是shell代码的示例。 这里:https://en.wikipedia.org/wiki/Shellcode
func = (int (*)()) code; /* What does this line mean? */
func是一个函数点,它指向“代码数组”的地址。
当调用func时,程序将跳转到数组的地址。