int eax = ((int(*)())("\xc3 <- This returns the value of the EAX register"))();
这是如何运作的?字符串被转换为函数指针
最佳答案
c3
是RET
指令。当 x86 机器跳转到这个被解释为代码的字符串时,它将执行 RET
并因此直接跳回去而不做任何事情(因此忽略字符串的其余部分)。由于 x86 上的标准调用约定是将您的返回值放在 eax
中,但是代码在返回之前没有做任何事情,所以 eax
中已经存在的内容仍然存在,并让 C 代码将其解释为已“返回”。
这在很大程度上取决于您的机器是 x86,并且您可以在数据和函数指针之间进行转换(并执行结果)——一个非常系统特定的 hack。无论如何,这都不是符合标准的 或 可移植 C!
(\xXX
是 C 的转义语法,用于通过十六进制的 ASCII 代码将单个不可读字符插入字符串,如果您不知道那部分的话。)
关于C 编程(函数指针转换),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24853956/