函数指针
Pointers to function
这个代码是什么意思?
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 */
}
func = (int (*)()) code;
code
作为一个数组,被隐式转换为指向其第一个元素的指针(它衰减为这样的指针)。然后将该指针转换为指向函数的指针。
此转换会导致未定义的行为。但是"most of the time",很可能会导致函数指针指向数组的地址。当你调用它时,控制跳转到这个数组。如果它包含字符串数据,您很可能会收到无效的操作码或分段错误。但是,如果该数组包含一些用户输入,恶意用户就可以将(编译)代码放入其中,做各种有趣(或不那么有趣)的事情。
举个例子,考虑上面的代码 运行 在某种服务器中,通过某个网站接收用户输入。然后可以用 for example /bin/sh
替换该程序,从而获得对该服务器的 shell 访问权限。
这是 shell 代码示例。
这里:https://en.wikipedia.org/wiki/Shellcode
func = (int (*)()) code; /* What does this line mean? */
func是一个函数点,指向"code array"的地址。
调用func时程序会跳转到数组地址
您看到的是 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;
}
你的函数所做的是获取字节码字符串并将其转换回函数指针,就像我们上面所做的那样。然后,您可以通过取消引用指针并通过添加括号和函数采用的任何参数来调用函数。
现在当然,在常规编程中你不需要做那样的事情,但在特殊情况下很少。
这个代码是什么意思?
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 */
}
func = (int (*)()) code;
code
作为一个数组,被隐式转换为指向其第一个元素的指针(它衰减为这样的指针)。然后将该指针转换为指向函数的指针。
此转换会导致未定义的行为。但是"most of the time",很可能会导致函数指针指向数组的地址。当你调用它时,控制跳转到这个数组。如果它包含字符串数据,您很可能会收到无效的操作码或分段错误。但是,如果该数组包含一些用户输入,恶意用户就可以将(编译)代码放入其中,做各种有趣(或不那么有趣)的事情。
举个例子,考虑上面的代码 运行 在某种服务器中,通过某个网站接收用户输入。然后可以用 for example /bin/sh
替换该程序,从而获得对该服务器的 shell 访问权限。
这是 shell 代码示例。 这里:https://en.wikipedia.org/wiki/Shellcode
func = (int (*)()) code; /* What does this line mean? */
func是一个函数点,指向"code array"的地址。
调用func时程序会跳转到数组地址
您看到的是 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;
}
你的函数所做的是获取字节码字符串并将其转换回函数指针,就像我们上面所做的那样。然后,您可以通过取消引用指针并通过添加括号和函数采用的任何参数来调用函数。
现在当然,在常规编程中你不需要做那样的事情,但在特殊情况下很少。