gpt4 book ai didi

c - 将 void(char*) 函数作为 void(void) 执行

转载 作者:行者123 更新时间:2023-11-30 14:23:42 25 4
gpt4 key购买 nike

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) 函数执行,其函数和参数都在内存中,这对我来说是新鲜事。

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

最佳答案

But executing void(int) function as a void(void) function with its function and parameters in memory is new to me.

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

Is there a standard of how a function look like in memory (like a string is terminated by a null character) such that you can execute it in this way?

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

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

关于c - 将 void(char*) 函数作为 void(void) 执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12612914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com