2012-11-29 4 views
1

아래 프로그램은 분할 오류를 발생시킵니다. 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 

답변

2

당신은 프로그램을 종료 ret을 사용할 수 없습니다. 예를 들어 사용할 수 있습니다. syscall :

movq $0x60, %rax 
xorq %rdi, %rdi 
syscall