这两条指令完全按照您的期望执行。您已经使用覆盖了之前的堆栈框架,
0x41因此当您点击时
leaveq,您将执行以下操作:
mov rsp, rbppop rpb
现在
rsp指向
rbp以前的操作。但是,您已经覆盖了该内存区域,因此当您执行时
pop rbp,硬件实际上就是在这样做
mov rbp, [rsp]add rsp,1
但是
[rsp]现在有了
0x41。因此,这就是为什么您看到
rbp被该值填充的原因。
至于为什么
rip没有像您期望的那样进行设置,那是因为
ret将设置
rip为
0x41,然后在指令提取时生成异常(页面错误)。在这种情况下,我不会依靠GDB来显示正确的内容。您应该尝试使用程序文本段中的有效地址覆盖返回值,并且您可能不会看到这种奇怪的行为。



