1

以下のプログラムは SEGMENTATION FAULT を引き起こします。このRET命令は、RETURN ADDRESS TO SYSTEM を回復しません。

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
4

1 に答える 1

2

retを使用してプログラムを終了することはできません。たとえば、使用できます。syscall:

movq $0x60, %rax
xorq %rdi, %rdi
syscall
于 2012-11-29T15:48:15.443 に答える