Ricardo
Ricardo

Reputation: 379

Segmentation fault on push inside a function x86_64 GAS

I have a little program that just adds an item to the stack and then enters a function to add another one. The problem is that it has a weird behaviour every time you execute it.

Here is the function:

.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

Nothing complex at all, but will fail giving a Segmentation fault and if you try to debug it you will find that the error occurs when the program enters inside the function but it will not have any info about where it's located.

Program received signal SIGSEGV, Segmentation fault. 0x0000000000000002 in ?? ()

Now, if you add a "pop" after the function push and run it then it will build and run successfully. BUT if you debug it you will see that it never gets inside the function using the "n"(next) command.

I've searched for an answer but didn't found anything similar at all for ASM. Recently started learning ASM and for me it looks perfectly nice so don't really know why it could be happening.

Upvotes: 0

Views: 241

Answers (1)

Segy
Segy

Reputation: 233

Your problem is here:

pfun:
    push $2
    ret

I think you dont understand call/ret correctly. Your function is eqivalent to jmp 2 and that always trigger exception in pm. call is same likepush (r)eip and then jmp and ret is pop (r)eip. In call/function you need to pop everything that you pushed here or add (r)esp,0x??

Upvotes: 2

Related Questions