0

我在理解以下情况下发生的事情时遇到了问题。我对 UNIX 管道和 UNIX 一点也不熟悉,但阅读过文档但仍然无法理解这种行为。

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

seclab$ ./shellcode
$ exit
seclab$

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

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

但是,一个新的 shell 没有打开(或者至少我看不到它并与之交互),如果我运行exit我就退出了系统,所以我不在一个新的 shell 中。

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

4

1 回答 1

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
于 2012-12-02T20:29:51.103 回答