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)函数及其函数和参数在内存中对我来说是新的。
是否存在函数在内存中的外观标准(如字符串由空字符终止),以便您可以以这种方式执行它?
答案 0 :(得分:2)
但是执行void(int)函数作为void(void)函数 记忆中的功能和参数对我来说是新的。
好。这是未定义的行为,你永远不应该这样做。它可能恰好适用于某些实现,但没有保证结果。
是否有一个关于函数在内存中的样子的标准(如a string由空字符终止),以便您可以执行它 这样吗?
不,没有。更相关的是,没有关于如何将参数传递给函数的标准 - 它取决于实现,并且不要求以不同类型的函数兼容的方式实现它。
但是在这种情况下,程序员正在利用内存中函数的相关知识,并以这样的方式准备文件,使其在加载到内存并在此特定实现中运行时做正确的事情。毕竟,这是加载器所做的......他们将文件中的程序读入内存然后执行它们。利用程序中的错误将恶意代码加载到程序的内存中并让程序执行它的漏洞利用了这种方法。