2017-10-08 4 views
0

私は、バッファオーバーフローの悪用によるセキュリティリークについて学習する目的で、UBの特別なケースの分析を行っています。バッファオーバーフローの悪用実験、予期しない結果

私は故意にUBを被った実験の結果を理解することができません。私はバッファ(他のバッファと私の検出器変数の間にある)のオーバーフローが、他のバッファと検出器の両方を上書きすると信じています。要するに

:何がこのコードで

strcpy(buffer_two, argv[1]); 

後 'の値' 変数の値が49の理由が考えられます。

#include <stdio.h> 
#include <string.h> 

int main(int argc, char *argv[]){ 
    int value = 5; 
    char buffer_one[8]; 
    char buffer_two[8]; 
    strcpy(buffer_one, "one"); 
    strcpy(buffer_two, "two"); 

    printf("[BEFORE] buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two); 
    printf("[BEFORE] buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one); 
    printf("[AFTER] value is at %p and is %d (0x%08x)\n", &value, value, value); 

    printf("\n[STRCPY] copying %d bytes into buffer_two\n\n", strlen(argv[1])); 
    strcpy(buffer_two, argv[1]); /* Copy first argument into buffer_two. */ 

    printf("[BEFORE] buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two); 
    printf("[BEFORE] buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one); 
    printf("[AFTER] value is at %p and is %d (0x%08x)\n", &value, value, value); 
} 

結果:

./overflow_example AAAAAAAAAAAAAAAA1 
[BEFORE] buffer_two is at 0xbff2db0c and contains 'two' 
[BEFORE] buffer_one is at 0xbff2db14 and contains 'one' 
[BEFORE] value is at 0xbff2db1c and is 5 (0x00000005) 

[STRCPY copying 17 bytes into buffer_two 

[AFTER] buffer_two is at 0xbff2db0c and contains 'AAAAAAAAAAAAAAAA1' 
[AFTER] buffer_one is at 0xbff2db14 and contains 'AAAAAAAA1' 
[AFTER] value is at 0xbff2db1c and is 49 (0x00000031) 

メモリのスタックが増えます。これは、buffer_oneの値を上書きすることを意味します。しかし、私はなぜ「価値」の価値がもたらされたのか分かりません。

+0

なぜ 'value'は厳密に影響を受けてはならないと思いますか?標準では、自動変数に特定のメモリレイアウトが必要ですか? – zerkms

+0

バッファオーバーフローがあり、未定義の動作につながります。何でも可能です。コードにUBがあるので、この質問は興味深いものではありません。 –

+5

私はこのトピックをトピックとして閉じようとしていますが、これは未定義の未定義の動作であるためです。 –

答えて

0

あなたの悪用実験では、バッファと変数の順番を失っているようです。 (一緒にコード内の変数宣言で)
あなたの出力は明確に示しています

  • buffer_two、サイズ8、アドレスの0x ... 0C
  • buffer_one、サイズ8、アドレスの0x ... 14
  • 値、サイズ4、アドレスの0x ... 1cの

(値の大きさは、それがLSB最下位のバイトアドレスを持っていると仮定すると、無関係な推測ですが、。)

buffer_twoオーバーフローが9バイトであれば、buffer_oneは完全に1の値の最初のバイト= 49、値の2番目のバイトは0となります。

厳密に言えば、すべてが厳密に言えばUBであり、 。しかしそれはあなたがおそらく認識している通常の悪用環境です。