1

バッファオーバーフローの演習を実行しようとしています。コードは次のとおりです。

#include <stdio.h>

int badfunction() {
  char buffer[8];
  gets(buffer);
  puts(buffer);
}

int cantrun() {

  printf("This function cant run because it is never called");

}

int main() {

  badfunction();

}

これは単純なコードです。目的は、バッファをオーバーフローさせbadfunction()、戻りアドレスをオーバーライドして、関数のメモリ アドレスを指すようにすることcantrun()です。

ステップ 1: 戻りアドレスのオフセットを見つけます (この場合は 12 バイトで、バッファーが 8 バイト、ベース ポインターが 4 バイトです)。

ステップ 2: のメモリ ロケーションを見つけますcantrun()。gdb は 0x0804849a だと言います。

プログラムを実行すると、printf "%012x\x9a\x84\x04\x08" | ./vuln「不正な命令」というエラーが表示されます。これは、EIP を正しく上書きしたが、メモリの場所が正しくないことを示唆していますcantrun()

Kali Linux、Kernel 3.14 を使用しています。ASLR をオフにし、execstack を使用して実行可能スタックを許可しています。私は何か間違ったことをしていますか?

アップデート:

暗闇の中でのショットとして、アドレスを移動して正しい命令を見つけようとしましたが、0x0804849b がうまくいきました。これが GDB の表示と異なるのはなぜですか。GDB を実行している場合、0x0804849a はプレリュード命令の場所であり、push ebp0x0804849b はプレリュード命令mov ebp,espです。

4

1 に答える 1

2

gdb は、実行するプログラム内の関数の場所を変更するために何もしません。ASLR は重要かもしれませんが、デフォルトでは gdb はこれをオフにして、より簡単なデバッグを有効にします。

なぜあなたが結果を見ているのかを言うのは難しい. gdb で関数を逆アセンブルすると何が表示されますか?

于 2015-02-17T22:34:36.773 に答える