我正在做一个 CTF 风格的练习,我在 pop-ret
小工具中发现了一些不寻常的东西。
这是一个64位的ELF文件,环境为Ubuntu 12.04.5(64位)。
我的意思是这样的:
如您所见,rsp 寄存器在 pop r15
之后没有改变(它们都是 0x7fff90f83520)! pop r15
本身没有抛出任何异常,但以下 ret
遇到了 SIGSEGV
,因为它不是有效地址。
有人知道为什么会这样吗?我不知道为什么。
谢谢!
最佳答案
pop 指令不会改变内存的实际内容。它只是将堆栈指针(代表堆栈顶部)指向的值复制到目标寄存器(在您的例子中为 r15),然后递增堆栈指针,这表示从中删除值当前堆栈。
顺便说一句,你没有指定指令集,所以我假设它是正常的。
关于linux - 为什么 `pop` 指令不从堆栈中弹出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33779706/