2016-07-10 2 views
-1

異なっている。ここスタックフレームがどのように見えるかです:は私のスタックフレームは、従来の1

(high memory addresses) 
    -function arguments 
    -return address 
    -saved frame pointer 
    -local variables 
(low memory addresses) 

私のスタックフレームは、そのように見える理由の質問は次のとおりです。

(high memory addresses) 
    -return address 
    -saved frame pointer 
    -local variables 
    -function arguments 
(low memory addresses) 

デバッグ中に、私はそれに気づきましたgdbで Cでコーディングし、Kali Linux x86_64(intel core i7)でgcc 5.4.0を使用してコンパイルします。

Cコード:主にRBPの

void test_function(int a, int b, int c, int d) { 
    int flag; 
    char buffer[10]; 
    flag = 31337; 
    buffer[0] = 'A'; 
} 

int main() { 
    test_function(1, 2, 3, 4); 
    return 0; 
} 

値:

0x7fffffffe260 

アセンブリ命令test_functtionコールアドレスの後:Xコマンドの

0x00000000004004e1 

結果RSP上でながらtest_functionフレーム:

0x7fffffffe240: 0x00000004 0x00000003 0x00000002 0x00000001 
0x7fffffffe250: 0x00400441 0x00000000 0x004003b0 0x00007a69 
0x7fffffffe260: 0xffffe270 0x00007fff 0x004004e1 0x00000000 
0x7fffffffe270: 0x004004f0 0x00000000 0xf7a575f0 0x00007fff 
+0

スタックが_downwards_に成長するため、正しいレジスタにあります。 – tkausl

+0

私は知っていますが、あなたがそれを逆にすれば、それは対応していません。 –

+1

"スタックフレームがどのように見えるかは次のとおりです:"#:。あなたはどこからそれを手に入れましたか? – kaylum

答えて

0

スタックフレームの仕様がx86とx86_64の間で大幅に変更されているようです。あなたはx86スタックフレーム(Intel386 Processor Supplement)に合っています。しかし、x86_64仕様(AMD64 Architecture Support Supplement)は整数引数をレジスタに渡します(3.2.3項)。以下のアイテム#2:クラスはメモリである

  1. 場合は、スタック上の引数を渡します。

  2. クラスがINTEGERの場合、シーケンスrdi、%rsi、%rdx、%rcx、%r8および%r9の次に使用可能なレジスタが使用されます。

  3. クラスがSSEの場合は、次の使用可能なベクトルレジスタが使用され、レジスタは%xmm0から%xmm7の順に使用されます。

  4. クラスがSSEUPの場合、8バイトは最後に使用されたベクトルレジスタの次の使用可能な8バイトのチャンクに渡されます。

  5. クラスがX87、X87UPまたはCOMPLEX_X87の場合、メモリに渡されます。

スタックフレームは次のようになります。

x86_64 stack frame

あなたはスタックフレームを見れば、メインでのリターンアドレスが8 [%のRBP]または0x004005beと引数です

(gdb) x/32 $rbp 
0x7fffffffe040: 0xffffe050 0x00007fff 0x004005be 0x00000000 
0x7fffffffe050: 0x00000000 0x00000000 0xf7a36f45 0x00007fff 
0x7fffffffe060: 0x00000000 0x00000000 0xffffe138 0x00007fff 
0x7fffffffe070: 0x00000000 0x00000001 0x004005a1 0x00000000 
0x7fffffffe080: 0x00000000 0x00000000 0xdf5e7534 0x8acdbc8c 
0x7fffffffe090: 0x00400470 0x00000000 0xffffe130 0x00007fff 
0x7fffffffe0a0: 0x00000000 0x00000000 0x00000000 0x00000000 
0x7fffffffe0b0: 0x1f9e7534 0x75324373 0x02a47534 0x753253ca 
(gdb) info registers 
rax   0x4005a1 4195745 
rbx   0x0 0 
rcx   0x4 4 
rdx   0x3 3 
rsi   0x2 2 
rdi   0x1 1 
.... 
+0

ありがとうございます –

関連する問題