linux - 为什么 `pop` 指令不从堆栈中弹出?

标签 linux debugging gdb stack segmentation-fault

我正在做一个 CTF 风格的练习,我在 pop-ret 小工具中发现了一些不寻常的东西。
这是一个64位的ELF文件,环境为Ubuntu 12.04.5(64位)。
我的意思是这样的:

  1. SIGSEGV(pop r15)之前的指令 enter image description here

  2. 遇到SIGSEGV的指令 enter image description here

如您所见,rsp 寄存器在 pop r15 之后没有改变(它们都是 0x7fff90f83520)! pop r15 本身没有抛出任何异常,但以下 ret 遇到了 SIGSEGV,因为它不是有效地址。

有人知道为什么会这样吗?我不知道为什么。
谢谢!

最佳答案

pop 指令不会改变内存的实际内容。它只是将堆栈指针(代表堆栈顶部)指向的值复制到目标寄存器(在您的例子中为 r15),然后递增堆栈指针,这表示从中删除值当前堆栈。

顺便说一句,你没有指定指令集,所以我假设它是正常的。

关于linux - 为什么 `pop` 指令不从堆栈中弹出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33779706/

相关文章:

c - 从进程内部查找映射的内存

php - 如何使用 PDO (mysql) 正确调试 Insert 语句?

java - 构建一个在 Linux 服务器上运行的 jar

c - 打印 uint8_t

c++ - 如何在 C++ 中使用回溯获取正确的代码行?

debugging - 如何在GDB中跳转到断点?

c++ - gdb:中断正在运行的进程而不杀死子进程

c++ - 在GDB中操作以$开头的C++成员变量

linux - ssh 连接上的 XQuartz 错误

c - 如何调用 lstat(2) 而不是 lstat(3)?