Ошибка сегментации при нажатии внутри функции x86_64 GAS - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть небольшая программа, которая просто добавляет элемент в стек, а затем входит в функцию, чтобы добавить еще один элемент. Проблема в том, что каждый раз, когда вы его выполняете, он ведет себя странно.

Вот функция:

.section .data

.section .text

.globl _start
_start:
    # Push
    push $1
    # Function call
    call pfun
    movq $60, %rax
    syscall

.type pfun, @function
pfun:
    # Push
    push $2
    # Return
    ret

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

Программа получила сигнал SIGSEGV, Ошибка сегментации. 0x0000000000000002 в ?? ()

Теперь, если вы добавите «pop» после функции push и запустите ее, она будет успешно скомпилирована и запущена. НО если вы отладите его, вы увидите, что он никогда не попадет внутрь функции, используя команду «n» (следующая).

Я искал ответ, но не нашел ничего похожего для ASM. Недавно начал изучать ASM, и для меня это выглядит великолепно, поэтому я не знаю, почему это может произойти.

1 Ответ

0 голосов
/ 14 ноября 2018

Ваша проблема здесь:

pfun:
    push $2
    ret

Я думаю, вы не правильно поняли call/ret.Ваша функция эквивалентна jmp 2, и это всегда вызывает исключение в pm.call такое же, как push (r)eip and then jmp, а ret - pop (r)eip.В вызове / функции вам нужно pop все, что вы здесь нажали или add (r)esp,0x??

...