【发布时间】:2018-09-18 06:25:17
【问题描述】:
我在玩一些汇编代码
func:
pop ax
ret
main:
push 0x44
call func
我注意到 ip 指针现在指向堆栈上的最后一项 0x44
我这样做是为了了解ROP 技术
我需要了解这种行为,因为当我这样做时
func:
ret
main:
call func
它按预期工作,EIP 指针指向原始代码
那么pop 改变代码流程有什么不同呢?pop ax 是否将堆栈上的最后一个值分配给 ax ?
【问题讨论】:
-
因为
call和ret也使用栈。 -
你为什么不阅读手册,
call和ret是做什么的? -
查阅指令集参考以了解每条指令的作用。 TL;DR:
call将返回地址放在堆栈上,ret将其删除。如果你在它之前插入一个pop,那么这个返回地址当然会被删除,ret将使用下一个可能错误的项目。 -
如果有人投反对票,请至少向我解释原因.. 请:)
-
下次如果您真的尝试阅读手册,请说出来并引用您无法理解的相关部分,以便我们进行解释。无论如何,在继续学习逆向工程和 ROP 等高级主题之前,您可能想多了解一些基本知识。另外,学习使用调试器单步执行代码,看看它在做什么。
标签: assembly x86 reverse-engineering