[英]Open a shell in the second process of a pipe
我在解決以下情況發生的情況時遇到了問題。 我根本不熟悉UNIX管道和UNIX,但是有讀取文檔但仍然無法理解這種行為。
./shellcode
是一個成功打開shell的可執行文件:
seclab$ ./shellcode
$ exit
seclab$
現在假設我需要通過stdin
將數據傳遞給./shellcode
,因為這會從控制台讀取一些字符串然后打印“hello”加上該字符串。 我通過以下方式(使用管道 )和讀寫工作:
seclab$ printf "world" | ./shellcode
seclab$ hello world
seclab$
然而,一個新的shell沒有被打開(或者至少我看不到它並且用它迭代),如果我運行exit
我不在系統中,所以我不在新的shell中。
有人可以就如何解決這個問題提出一些建議嗎? 我需要使用printf,因為我需要將二進制數據輸入到第二個進程,我可以這樣做: printf "\\x01\\x02..."
當您使用管道時,您告訴Unix管道之前的命令輸出應該用作管道之后命令的輸入。 這將替換默認輸出(屏幕)和默認輸入(鍵盤)。 您的shellcode
命令並不真正了解或關注其輸入的來源。 它只是讀取輸入,直到它到達EOF(文件結束)。
嘗試運行shellcode
並按Control-D。 這也將退出shell,因為Control-D發送了一個EOF(你的shell可能被配置為說“鍵入exit
to quit”,但它仍然響應EOF)。
您可以使用兩種解決方案:
解決方案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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.