2

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 は次のことを行います。

  1. バッファーを NOP で埋める
  2. シェルコードをバッファの真ん中に置く
  3. 必要な RET (0xbfff620) でバッファの末尾を埋める
  4. バッファを送信する (シェルコードを含む)
  5. 次に、プログラムの 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 は引き続きセグメンテーション エラーを受け取ります。ポートは開かれません。

4

0 に答える 0