首页 > 解决方案 > 覆盖函数返回地址时在 macOS 上发生意外崩溃

问题描述

我正在编写一个程序,它将许多参数作为输入参数。我决定将通过寄存器传递的所有这些复制到堆栈中。为了使迭代更加一致,我决定将函数返回地址保留在当时未使用的寄存器之一中。每当我覆盖返回地址时,程序就崩溃了。您可以在下面找到说明问题的一小段代码。原因是什么?退货地址是否受到任何保护?

section .text
  global _function

_function:
    mov rdx, rsp ; save return address
    mov rsp, 2   ; override return address, crashes here (segfault)
    mov rsp, rdx ; restore address
    ret

C程序:

#include <stdio.h>

extern int function (int n, ...);

int main() {
    printf("%d", function(7, 1, 1, 1, 1, 1, 1, 2));
}

标签: cmacosassemblynasmx86-64

解决方案


推荐阅读