Неожиданный сбой в macOS при переопределении адреса возврата функции - PullRequest
0 голосов
/ 18 ноября 2018

Я писал программу, которая принимает много аргументов в качестве входных параметров.Я решил скопировать все из них, которые были пропущены через регистры, в стек.Чтобы сделать итерацию более согласованной, я решил сохранить адрес возврата функции в одном из регистров, который не использовался в то время.Всякий раз, когда я переопределял обратный адрес, программа вылетала.Ниже вы можете найти небольшой фрагмент кода, который иллюстрирует проблему.В чем причина?Защищен ли обратный адрес каким-либо образом?

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));
}
...