2016-07-15 15 views
2

私は(GCCでコンパイル)、簡単なCプログラムを分解して、スタックのカナリアを配置するための責任の命令は次のとおりです。カナリアが8バイト(rax)で、まだ、唯一の4バイト(というスタック・カナリアの半分しかクリアされないのはなぜですか?

mov %fs:0x28,%rax 
mov %rax,-0x8(%rbp) 
xor %eax,%eax 

注意xor eax eax)がクリアされます。

これは意図的ですか?コードがちょうどスタックカナリーの半分を漏らしたようです。

答えて

2

amd64では、レジスタの下位32ビットを変更すると、上位32ビットがクリアされます。これは、レジスタの下位部分を変更する場合とは異なります。たとえば、xor al, alは、raxの8つの下位ビットのみをクリアします。

xor eax, eaxは、xor rax, raxよりも1バイト短いため、通常、最初のコンパイラが優先されます。

+0

これは恥ずかしいほど簡単な質問であることが判明しました。ありがとう! – 0x00

関連する問題