【问题标题】:Executing void(char*) function as a void(void)将 void(char*) 函数作为 void(void) 执行
【发布时间】:2012-09-18 17:44:29
【问题描述】:
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) 函数执行,其函数和参数在内存中对我来说是新的。

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

【问题讨论】:

  • 你为什么要做你想做的事?
  • 将函数指针转换为不同的原型将产生“未定义的结果”。它可能会起作用,或者它可能会导致我们所知的宇宙终结。 (或者那是穿越溪流?)
  • 函数在内存中的外观没有standard。请阅读这篇文章:en.wikipedia.org/wiki/Assembly_language 它可能会让你更了解这些东西是如何组织的。
  • 朋友的任务。我非常严格地按照他的指导员的书面指示将那条信息打印出来,否则它会打印出垃圾。他的下一个问题是:提示用户输入命令(cmd ...),将参数(由 null 分隔)加载到 char * getargs(int) 可访问的内存中,将 getargs 存储到特定地址,然后执行 cmd。我坚持执行 cmd,我认为这个问题可能会有所帮助。我怀疑它会是system(input_string)。对于研究生水平的课程来说听起来太容易了,并且不能证明 getargs 的存在以及存储在内存中的所有内容

标签: c memory function-pointers


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢,似乎每个人都同意,对于带参数的函数在内存中如何作为 void(void) 执行没有标准。
猜你喜欢
  • 2020-10-24
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多