2017-08-12 2 views
0

私は現在、「Art of Exploitation」という本の搾取を学んでいます。最初のコードは基本的に私に非常に基本的なオーバーフローを教えてくれました。これは本からのコードです:[AFTER] buffer_oneではなく、 "1" の "90" が含まれていることになっているARGVで実行した後オーバーフローしないバッファオーバーフロー

#include <stdio.h> 
#include <string.h> 
int main(int argc, char *argv[]) { 
    int value = 5; 
    char buffer_one[8], buffer_two[8]; 
    strcpy(buffer_one, "one"); /* Put "one" into buffer_one. */ 
    strcpy(buffer_two, "two"); /* Put "two" 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("[BEFORE] 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("[AFTER] buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two); 
    printf("[AFTER] 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); 
} 

[1]私は

[BEFORE] buffer_two is at 0x7ffc97c28ac0 and contains 'two' 
[BEFORE] buffer_one is at 0x7ffc97c28ad0 and contains 'one' 
[BEFORE] value is at 0x7ffc97c28adc and is 5 (0x00000005) 

[STRCPY] copying 9 bytes into buffer_two 

[AFTER] buffer_two is at 0x7ffc97c28ac0 and contains '1234567890' 
[AFTER] buffer_one is at 0x7ffc97c28ad0 and contains 'one' 
[AFTER] value is at 0x7ffc97c28adc and is 5 (0x00000005) 

を得た1234567890 =。私は私のオフセットが8バイト(0x7ffc97c28ac0と0x7ffc97c28ad0)の代わりに16バイトであることに気付きました。それがifがbuffer_oneにオーバーフローしない理由です。どのようなアイデアを見て、これは非常に深刻な問題ですか?

+2

x64用にコンパイルするよう指示されていますか?特定のコンパイラ、バージョン、フラグを指定していますか? – Dai

+3

おそらく、使用するコンパイラは、作成者が使用するコンパイラとは異なる方法でデータを出力します。また、9バイトをコピーしたプログラムのことを指摘するかもしれません.10バイトをコピーしたはずです。 –

+0

ちょうど基本的な 'gcc -o overflow_example overflow_example.c'では' -fno-stack-protector'を追加しました。 – ledao

答えて

1

[AFTER] buffer_oneには、「1」ではなく「90」が含まれていると想定されています。

いいえ、いいえ、千回もありません。 ではなく、のいずれかがの値を保持すると想定されています。あなたがやっているのは、定義されていない振る舞いです。結果はなので、完全に動作していればです。あなたは2つのアドレスを調べる場合

実際には、0x7ffc97c28ac00x7ffc97c28ad0は、あなたは、彼らがバイト離れていることがわかりますない8 (a)の。実装は完全に許可されているのは、あなたが尋ねたものがであることだけです。これは、バッファオーバーフローのために、あなたのstrcpyにさらにいくつかのバイトが必要であることを意味します。


64ビットアーキテクチャのための16バイト境界上のアイテムを揃えるために、より効率的かもしれないので(a)は、このための一つの可能​​な理由は、(あなたのアドレスは48ビットではなく32思えるしているという事実これが真であることを示す)。あなたの本は32ビットシステムで書かれているはずです。

しかし、私はの可能性がありますの理由だけを強調します。開発には、あなたが取り組んでいる環境を非常に深く理解する必要があります。

+0

しかし、しかし、しかし、1つの本は、それを行う必要があると言った! –

+0

私はあなたが意味するものを持っていると思う:)それは、 "本はそれを行うべきだと言った"の代わりに、そういう考え方をするのが良い。あなたの助けを借りてありがとう、このnoobは行くには長い道のりがあります:D – ledao

関連する問題