在管道的第二个过程中打开一个shell

时间:2012-12-02 19:29:10

标签: shell pipe freebsd

我在理解以下情况发生的情况时遇到了问题。我根本不熟悉UNIX管道和UNIX,但是有阅读文档但仍然无法理解这种行为。

./shellcode是一个成功打开shell的可执行文件:

seclab$ ./shellcode
$ exit
seclab$

现在假设我需要通过./shellcode将数据传递给stdin,因为这会从控制台读取一些字符串然后打印“hello”加上该字符串。我通过以下方式(使用管道)并且读取和写入工作:

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

然而,一个新的shell没有被打开(或者至少我看不到它并且用它迭代),如果我运行exit我不在系统中,所以我不在一个新的外壳。

有人可以就如何解决这个问题提出一些建议吗?我需要使用printf,因为我需要将二进制数据输入到第二个进程,我可以这样做:printf "\x01\x02..."

1 个答案:

答案 0 :(得分:2)

当您使用管道时,您告诉Unix管道之前的命令输出应该用作管道之后命令的输入。这将替换默认输出(屏幕)和默认输入(键盘)。您的shellcode命令并不真正了解或关注其输入的来源。它只是读取输入,直到它到达EOF(文件结束)。

尝试运行shellcode并按Control-D。这也将退出shell,因为Control-D发送了一个EOF(你的shell可能被配置为说“键入exit以退出”,但它仍然响应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