0

次の状況で何が起こっているのか理解できません。UNIX パイプと UNIX にはまったく詳しくありませんが、ドキュメントを読んでも、この動作を理解できません。

./shellcodeシェルを正常に開く実行可能ファイルです。

seclab$ ./shellcode
$ exit
seclab$

./shellcodeviaにデータを渡す必要があるとしますstdin。これは、コンソールから文字列を読み取り、"hello" とその文字列を出力するためです。私は次の方法で(パイプを使用して)それを行い、読み取りと書き込みが機能します:

seclab$ printf "world" | ./shellcode
seclab$ hello world
seclab$

ただし、新しいシェルは開かれません (または、少なくともそれを確認して操作することはできません)。実行exitすると、システムから外れるので、新しいシェルにはなりません。

誰かがこれを解決する方法についてアドバイスできますか? バイナリ データを 2 番目のプロセスに入力する必要があるため、printf を使用する必要があり、次のように実行できます。printf "\x01\x02..."

4

1 に答える 1

2

パイプを使用すると、パイプの前のコマンドの出力をパイプの後のコマンドへの入力として使用する必要があることを Unix に伝えます。これは、デフォルトの出力 (画面) とデフォルトの入力 (キーボード) を置き換えます。あなたのshellcodeコマンドは、その入力がどこから来ているのかを本当に知らないか気にしません。EOF (ファイルの終わり) に達するまで入力を読み取るだけです。

shellcode実行して Control-D を押してみてください。Control-D が EOF を送信するため、シェルも終了します (シェルは「type to quit」と言うように構成されている可能性がありますがexit、それでも EOF に応答しています)。

使用できるソリューションは 2 つあります。

解決策 1:

shellcodeコマンドライン引数を受け入れる:

#!/bin/sh
echo "Arguments: $*"
exec sh

ランニング:

outer$ ./shellcode foo
Arguments: foo
$ echo "inner shell"
inner shell
$ exit
outer$

パイプを使用する代わりに、別のプログラムから引数をフィードするには、次のことができます。

$ ./shellcode `echo "something"`

複数行のデータを渡す必要がない限り、これがおそらく最良の方法です。その場合、コマンド ラインでファイル名を渡し、そのように読み取ることができます。

解決策 2:

shellcodeパイプ入力を処理した後、端末からの入力を明示的にリダイレクトします。

#!/bin/sh
while read input; do
  echo "Input: $input"
done
exec sh </dev/tty

ランニング:

outer$ echo "something" | ./shellcode
Input: something
$ echo "inner shell"
inner shell
$ exit
outer$

内部シェルを終了した後に次のようなエラーが表示される場合:

sh: 1: Cannot set tty process group (No such process)

次に、最後の行を次のように変更してみてください。

exec bash -i </dev/tty
于 2012-12-02T20:29:51.103 に答える