ICMP 란?

 ->internet control message protocol의 줄임말로 다른 호스트 혹은 게이트웨이에 연결된 네트워크 상태를 알아보는데 사용된다. 대표적으로 ping이 있음.



ICMP packet 구조는 다음과 같으며, Header 타입은 다음과 같다.



리눅스에서는 /usr/include,netinet/ip_icmp.h에 정의 되어 있다.




ICMP Type을 바꿔서 요청을 보내보는 간단한 소스.


#include<stdio.h>

#include<sys/socket.h>

#include<arpa/inet.h>

#include<string.h>

#include<stdlib.h>

#include<netinet/ip.h>

#include<netinet/ip_icmp.h>

#include<netinet/in.h>

#include<net/ethernet.h>


int main(int argc,char *argv[])

{

int icmp_sock;

struct icmp *p,*rp;

struct sockaddr_in addr,from;

char buffer[1024];

struct ip *ip;

int hlen;

socklen_t sz;


icmp_sock=socket(PF_INET,SOCK_RAW,IPPROTO_ICMP);


p=(struct icmp*)buffer;

p->icmp_type=8;

p->icmp_code=0;

p->icmp_cksum=0;

p->icmp_seq=15;

p->icmp_id=1234;


addr.sin_addr.s_addr=inet_addr(argv[1]);

addr.sin_family=AF_INET;

sz=sizeof(from);

sendto(icmp_sock,p,sizeof(*p),MSG_DONTWAIT,(struct sockaddr*)&addr,sizeof(addr));

recvfrom(icmp_sock,buffer,1024,0,(struct sockaddr*)&from,&sz);

ip=(struct ip*)buffer;

hlen=ip->ip_hl*4;

rp=(struct icmp*)(buffer+hlen);

printf("icmp type : %d\n",rp->icmp_type);

close(icmp_sock);

}

p->icmp_type 부분을 8과 0으로 바꿔보자. 8과 0에 대한 것은 위의 icmp header type표에 나와있다.



wireshark 로 패킷을 잡아보면 type이 8인것을 확인 할 수 있다.

이번엔 type을 0으로 바꿔서 날려보면.


'NetWork' 카테고리의 다른 글

VMware network  (0) 2012.07.10
tcphdr , tcphdr??  (0) 2012.07.09
ARP_Spoofing  (2) 2012.07.06
TCP / IP 프로토콜 스택  (0) 2012.04.25
Wireshark_Network Analysis  (2) 2012.04.17

+ Recent posts