C编程(函数指针转换)

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

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

c3RET指令。 当x86机器跳转到解释为代码的字符串时,它将执行RET ,因此在没有做任何事情的情况下向后跳转(因此忽略了其余的字符串)。 由于x86上的标准调用约定是将你的返回值放在eax ,但是代码在返回之前没有做任何事情,所以eax任何内容仍然存在,并且C代码将其解释为已经存在“回”。

这在很大程度上取决于您的机器是x86,并且您可以在数据和函数指针之间进行转换(并执行结果) – 这是一个特定于系统的黑客攻击。 这不是标准兼容便携式C!

\xXX是C的转义语法,用于通过hex的ASCII代码将单个不可读字符插入字符串,如果您不知道该部分。)

0xc3是x86中的ret操作码。 字符串的其余部分仅用于调味。 所有的工作都是由调用约定完成的,而cdecl调用约定(C语言的默认约定)表示返回int的函数在eax返回它。

你的函数实际上没有做任何事情 ,它只是在调用它时立即返回,但任何调用int foo = eax()代码仍然期望它将其返回值放入eax寄存器,所以它会将eax寄存器的内容复制到foo