バッファオーバーフローの演習を実行しようとしています。コードは次のとおりです。
#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 ebp
0x0804849b はプレリュード命令mov ebp,esp
です。