繁体   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