Yas*_*shM 9 c pointers casting function
int eax = ((int(*)())("\xc3 <- This returns the value of the EAX register"))();
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?字符串被转换为函数指针
Leu*_*nko 12
c3是RET指令.当x86机器跳转到解释为代码的字符串时,它将执行RET,因此在没有做任何事情的情况下向后跳转(因此忽略了字符串的其余部分).由于x86上的标准调用约定是将你的返回值放入eax,但代码在返回之前没有做任何事情,已经eax存在的任何东西仍然存在,并且C代码将其解释为已经"返回" ".
这是高度依赖于你的机器是x86和自己获准数据和函数指针之间施放(和执行结果) -一个非常具体的系统的黑客.这不是标准兼容或便携式C!
(\xXX是C的转义语法,用于通过十六进制的ASCII代码将单个不可读字符插入字符串中,如果您不知道该部分.)
0xc3是retx86中的操作码.字符串的其余部分仅用于调味.所有工作都是由调用约定完成的,cdecl调用约定(C语言的默认约定)表示返回的函数将其int返回eax.
你的函数实际上并没有做任何事情,它只是在调用它时立即返回,但是任何调用的代码int foo = eax()仍然期望它将其返回值放入eax寄存器中,因此它将把eax寄存器的内容复制到foo.
| 归档时间: |
|
| 查看次数: |
900 次 |
| 最近记录: |