int eax = ((int(*)())("\xc3 <- This returns the value of the EAX register"))();

这是怎么回事?字符串被转换为函数指针

最佳答案

c3RET指令。当x86机器跳转到这个解释为代码的字符串时,它将执行RET并因此在没有做任何事情的情况下直接跳转回来(因此忽略字符串的其余部分)。因为x86上的标准调用约定是将返回值放在eax中,但是代码在返回之前没有做任何事情,所以已经在eax中的内容仍然存在,并且C代码可以将其解释为“已返回”。
这在很大程度上取决于您的机器是x86,并且允许您在数据和函数指针之间进行转换(并执行结果)-这是一个非常特定于系统的黑客攻击。这不是标准兼容或便携式的任何伸展!
\xXX是c的转义语法,用于通过十六进制的ascii代码将单个不可接受字符插入字符串中(如果您不知道该部分的话)。

07-24 09:44
查看更多