http://www.ouah.org/readmeneu.htmのチュートリアルに従ってバッファ オーバーフローを実行する方法を学習しようとしていますが、エクスプロイトを機能させることができません。
ソース、exploit.c: http://pastebin.com/b95G2KK7および server.c: http://pastebin.com/PM4GdcT7。使用されているシェルコードはhttp://pastebin.com/fuGgDeAHです。
私は、exploit.c と server.c を変更して、それらを実行できるようにしました。-fno-stack-protector を指定して server.c をコンパイルし、/proc/sys/kernel/randomize_va_space を 0 に設定しました。シェルコードもテストしました (gcc shellcode.c -z execstack; ./a.out; netcat 127.0.0.1 64713)。そしてそれは動作します。
私が理解していることから、exploit.c は次のことを行います。
- バッファーを NOP で埋める
- シェルコードをバッファの真ん中に置く
- 必要な RET (0xbfff620) でバッファの末尾を埋める
- バッファを送信する (シェルコードを含む)
- 次に、プログラムの RET でシェルコードを実行する必要があります
そこで、gdb をロードしてサーバー プログラムを実行します。エクスプロイト プログラムを実行すると、セグメンテーション エラーが発生し、正しい RET アドレスが返されます。
プログラム受信信号 SIGSEGV、セグメンテーション違反。??で0xbffff620 ()
(gdb) 'x/400bx $esp-200' の出力は、次の URL で確認できます: http://pastebin.com/bCqphFNn正しいようです..
残念ながら、プログラムは 127.0.0.1 64713 のポートを開きません。
(gdb) show stack が表示されます:
eip = 0xbffff620; 保存された eip 0x90909090
0xbffff62c でフレームによって呼び出されます
0xbffff62c の引数リスト、args:
ローカルは 0xbffff62c、前のフレームの sp は 0xbffff628
保存されたレジスタ:
0xbffff620 の ebp、0xbffff624 の eip
続行する方法がわかりません。どうすればエクスプロイトを機能させることができますか? 私は何が欠けていますか?
* 更新しました *
(-g) および (-z execstack) オプションを使用して server.c をコンパイルしました。gdb から作業している場合: エクスプロイトは機能しているようです (64713 のポートを開きます)。しかし、nc または telnet を使用してそのポートに接続しようとすると、server.c は SIGSEGV シグナル (0xbffff6fc) を受信します。ポート 64713 はまだ開いていますが、どのコマンドにも応答しません。
gdb を使用しない場合: ./exploit が実行されると、server.c は引き続きセグメンテーション エラーを受け取ります。ポートは開かれません。