web-dev-qa-db-ja.com

シェルコードの実行時にint 0x80命令を実行するとプログラムが終了する

学校では、バッファオーバーフローを実行する割り当てが与えられました。これにより、シェルコードが実行され、新しいシェルが開きます。少しバッファオーバーフローに成功した後、GDBでエクスプロイトを実行すると、プログラムが/ bin/dashを実行していると表示され、その後、エクスプロイトしたプログラムは正常に終了し、シェルがなくなりました。

エクスプロイトのテストプログラムを実行すると、問題なく実行され、想定どおりのシェルが表示されます。シェルコードを使用して実際に動作する別のプログラムを悪用しようとすると、エラーは発生しませんが、新しいシェルは生成されません。私は自分でコンパイルしたファイルを実行するようにシェルコードを変更しようとしましたが、ホスト名を出力するいくつかの単純なもので試してみましたが、これはうまくいきます。そのようなファイルにsystem("/bin/sh");を追加しても、希望どおりにシェルが生成されません。

GDBを使用してシェルコードをシングルステップ実行すると、int 0x80命令を実行した直後に、利用している脆弱なプログラムが終了することがわかります。ここで私の質問は2つあります。なぜここに存在しないのか、そしてそれを防ぐにはどうすればよいのか、つまり使用できる新しいシェルを生成するのですか

ここに私が使用するシェルコードがあります:

"\x6a\x0b" // Push byte +0xb
"\x58" // pop eax
"\x99" // cdq
"\x52" // Push edx
\x68\x2f\x2f\x73\x68" // Push dword 0x68732f2f (hs//)
"\x90" //nop
"\x90" //nop
"\x68\x2f\x62\x69\x6e" // Push dword 0x6e69922f (nib/)
"\x89\xe3" // mov ebx, esp
"\x31\xc9" // xor ecx, ecx
"\xcd\x80" // int 0x80 
"\x90" //nop
"\x90" //nop
"\x90" //nop
"\xeb\xfb"; //jmp -4

私が使用しているシェルコードは here なので、これのクレジットはipvにあります。

3
Psyberion

コマンドラインからこれを実行していて、<を使用してファイルからシェルコードをフィードしている場合、シェルは入力の終わりに達するとすぐに終了します。キーボードインタラクティブのままにする場合は、次の操作を行います。

猫shellcode.hex-| ./vulnerable_program

-はstdin(この場合はキーボード入力)なので、その後は好きなように入力できます。

7
lintile

/ bin/shは実際には別のプロセスであるため、gdbはその分岐プロセスをデバッグできません。しかし、シェルコードを実行しているだけなので、実際に/ bin/shをデバッグする必要があるようには思えません。実際にエクスプロイトが別のプロセスを開始できることを確認すると、エクスプロイトが成功したことを示すはずです。また、この投稿をチェックアウトすることもできます: https://stackoverflow.com/questions/2859127/shellcode-for-a-simple-stack-overflow-exploited-program-with-Shell-terminates-d

1
user1786575

入力を再度開くシェルコードを使用します。たとえば、マルコイヴァルディのコードのこの58バイト変更バージョンは、このトリックを実行します。

"\x83\xc4\x10\x31\xc0\x31\xdb\xb0\x06\xcd\x80\x53\x68/tty\x68/dev\x89\xe3\x31\xc9\x66\xb9\x12\x27\xb0\x05\xcd\x80\x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80"

詳細は here を参照してください。

1
Aralox