아래 프로그램은 분할 오류를 발생시킵니다. RET
명령은 RETURN ADDRESS TO SYSTEM을 복구하지 않습니다.gnu 어셈블리 x86-64 아키텍처의 RET 명령어 FAIL
gdb 세션을 디버깅 할 때 반환 주소가 스택에 없다는 것을 읽을 수 있습니다. 첫 번째 명령 pushq %rbp
전에 %rsp
스택 포인터는 반환 주소가 아닌 0x00000000 주소를 참조하고 SEGMENTATION DEFAULT를 발생시킵니다.
_start 레이블에 중단 점을 설정할 때 디버그 세션에서 실행할 첫 번째 명령은 끝에 있지 않습니다 .... 프롤로그입니다.
시스템 호출 오퍼레이션이 스택 포인터와 올바르게 작동하지 않으며 리턴 주소를 저장하지 않음이 분명합니다.
이전 32 비트 플랫폼에서는이 문제가 없었습니다.
¿ 몇 가지 아이디어가 있습니까? 미리 감사드립니다.
GDB 세션 : 소스 코드
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