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);
}
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 |