C编程(函数指针转换)
int eax = ((int(*)())("\xc3 <- This returns the value of the EAX register"))();
这是怎么回事? 字符串被转换为函数指针
c3
是RET
指令。 当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
。