0
void print( char * str ){ printf("%s",str); }

void some_function(){
    ... Loads a file into `char * buffer` ...
    ... Stores the function print before `buffer` address ...
    ((void(*)(void))buffer();
}

在文件中,有一个“Hello World”,还有一些不可读的字符。执行缓冲区将打印“Hello World”。

我知道你可以执行这样的指针:

void (*foo)(int) = &bar; // such that void bar(int)
(*foo)(123);

但是将 void(int) 函数作为 void(void) 函数执行,其函数和参数在内存中对我来说是新的。

是否有一个函数在内存中的外观标准(如字符串以空字符终止),以便您可以以这种方式执行它?

4

1 回答 1

2

但是将 void(int) 函数作为 void(void) 函数执行,其函数和参数在内存中对我来说是新的。

好的。这是未定义的行为,您永远不应该这样做。它可能会在某些实现上起作用,但不能保证结果。

是否有一个函数在内存中的外观标准(如字符串以空字符终止),以便您可以以这种方式执行它?

不,没有。更相关的是,没有关于如何将参数传递给函数的标准——这取决于实现,并且不要求以具有不同类型的函数兼容的方式实现它。

但是在这种情况下,程序员正在利用函数在内存中的样子的知识,并以这样一种方式准备文件,即当它加载到内存中并在这个特定的实现中运行时,它会做正确的事情。毕竟,这是加载程序所做的……它们将程序从文件读取到内存中,然后执行它们。利用程序中的错误将恶意代码加载到程序的内存中并让程序执行它的漏洞利用程序也使用此方法。

于 2012-09-27T02:58:43.613 回答