以下程序会导致SEGMENTATION FAULT。 RET
指令不会将RETURN ADDRESS恢复为SYSTEM。
使用gdb调试会话,我可以读到返回地址不在堆栈上。在第一条指令pushq %rbp
之前,%rsp
堆栈指针引用的0x00000000地址不是返回地址并导致SEGMENTATION DEFAULT。
在调试会话中,当我在_start标签上设置断点时,要执行的第一条指令不是Epilogue ....它是Prologue。
很明显,系统调用操作不能使用堆栈指针正常运行,也不保存返回地址。
我在旧的32位平台上没有这个问题。
¿有些想法? 提前谢谢。
gdb session:
Reading symbols from /home/candido/tutoriales/as_tutorial/examples/basicos_64/nada/ret_fault...done.
(gdb) b _start
Breakpoint 1 at 0x40007c: file ret_fault.s, line 15.
(gdb) run
Starting program: /home/candido/tutoriales/as_tutorial/examples/basicos_64/nada/ret_fault
(gdb) x /x $rsp
0x7fffffffe068: 0x00000000
(gdb)
作为源代码:
### Simple Prologue Epilogue Module
### System call don't save the RETURN ADDRESS
### Assembling: as -gstabs -o ret_fault.o ret_fault.s
### Linking: ld -o ret_fault ret_fault.o
### Execution: ./ret_fault
### System warning: SEGMENTATION FAULT
### System platform: Linux lur 3.2.0-33-generic #52-Ubuntu SMP x86_64 GNU/Linux
.text
.globl _start
_start:
## Epilogue
pushq %rbp # save calling frame pointer
movq %rsp, %rbp # set called frame pointer
## Prologue
movl $0, %eax # set return value
popq %rbp # restore calling frame pointer
ret # return to system. Get return address from stack and load on RIP register.
.end
答案 0 :(得分:2)
您无法使用ret
结束程序。你可以使用例如。 syscall
:
movq $0x60, %rax
xorq %rdi, %rdi
syscall