我在理解以下情况发生的情况时遇到了问题。我根本不熟悉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..."
答案 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