私は、バッファオーバーフローの悪用によるセキュリティリークについて学習する目的で、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の値を上書きすることを意味します。しかし、私はなぜ「価値」の価値がもたらされたのか分かりません。
なぜ 'value'は厳密に影響を受けてはならないと思いますか?標準では、自動変数に特定のメモリレイアウトが必要ですか? – zerkms
バッファオーバーフローがあり、未定義の動作につながります。何でも可能です。コードにUBがあるので、この質問は興味深いものではありません。 –
私はこのトピックをトピックとして閉じようとしていますが、これは未定義の未定義の動作であるためです。 –