【网络编程】SYN Flood (SYN洪水攻击) 源代码分析

一.原理

1、TCP握手协议

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

在上述过程中,还有一些重要的概念:
未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。

2、SYN攻击原理

SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。

配合IP欺骗,SYN攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

二.完整源代码

请前往我的github下载:

https://github.com/jiangeZh/SYN_Flood.git

三.部分源码分析

1.主函数

/* 为DNS地址,查询并转换成IP地址 */
/*
 *gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针。
 *struct hostent
 *{
 *  char *h_name;
 *  char **h_aliases;
 *  short h_addrtype;
 *  short h_length;
 *  char **h_addr_list;
 *  #define h_addr h_addr_list[0]
 *};
 */
host = gethostbyname(argv[1]);
if(host == NULL)
{
    perror("gethostbyname()");
    exit(1);
}
addr.sin_addr = *((struct in_addr*)(host->h_addr));
strncpy( dst_ip, inet_ntoa(addr.sin_addr), 16 );
/* 建立原始socket */
/* raw icmp socket(IPPROTO_ICMP):
 * 不用构建IP头部分,只发送ICMP头和数据。返回包括IP头和ICMP头和数据。
 * raw udp socket(IPPROTO_UDP):
 * 不用构建IP头部分,只发送UDP头和数据。返回包括IP头和UDP头和数据。
 * raw tcp socket(IPPROTO_TCP):
 * 不用构建IP头部分,只发送TCP头和数据。返回包括IP头和TCP头和数据。
 * raw raw socket(IPPROTO_RAW):
 * 要构建IP头部和要发送的各种协议的头部和数据。返回包括IP头和相应的协议头和数据。
 */
sockfd = socket (AF_INET, SOCK_RAW, IPPROTO_TCP);   
if (sockfd < 0)    
{
    perror("socket()");
    exit(1);
}
/* 当需要编写自己的IP数据包首部时,可以在原始套接字上设置套接字选项IP_HDRINCL.
 * 在不设置这个选项的情况下,IP协议自动填充IP数据包的首部.
 */
if (setsockopt (sockfd, IPPROTO_IP, IP_HDRINCL, (char *)&on, sizeof (on)) < 0
  • 25
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值