簡體   English   中英

在管道的第二個過程中打開一個shell

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM