私は現在、「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にオーバーフローしない理由です。どのようなアイデアを見て、これは非常に深刻な問題ですか?
x64用にコンパイルするよう指示されていますか?特定のコンパイラ、バージョン、フラグを指定していますか? – Dai
おそらく、使用するコンパイラは、作成者が使用するコンパイラとは異なる方法でデータを出力します。また、9バイトをコピーしたプログラムのことを指摘するかもしれません.10バイトをコピーしたはずです。 –
ちょうど基本的な 'gcc -o overflow_example overflow_example.c'では' -fno-stack-protector'を追加しました。 – ledao