보안세상

IP헤더와 TCP헤더분석 본문

공부

IP헤더와 TCP헤더분석

똔민 2016. 12. 4. 19:03
반응형

ip헤더 구조



ip.h헤더파일




stIp= struct ip자료형, ip.h파일에 정의 되어있는 자료형이다. 

usCehecksum을 unsigned short형의 자료형. ip.h에 checksum에 해당하는 ip_sum을 변수 usCehecksum에 집어넣는다.

stIp->ip_sum=0x0000;은 앞에 2바이트 네자리를 0으로 채운다. 

아래 printf문에서 조건 연산식을 써서 uschecksum이 함수 smart_cksum과 같은 경우에 yes, 거짓이면, no를 출력한다.

(usChecksum==smart_cksum(stIp->ip_hl)*4)?"yes":"no"); 이부분이다. 



smart()함수

인자로 stIp와 (stIp->ip_hl)*4를 받는다.

아래그림을 보면 알수 있듯이 헤더의 크기이다. (ip_hl)


처음 for문에서 (stIp->ip_hl)*4헤더의 크기만큼 돈다. ulSum에 stIp를 더한다.

함수의 첫번째 인자가 void *vp이고, stIp는 unsigned short형이기 때문에 캐스팅을 시켰다. *((unsigned short *)vpData;

vpData를 +1하여 크기만큼 주소를 이동한다. 

다음 ulSum= >>16번 오른쪽으로 당기고, 그것을 0과 마스킹하여 1이 된 숫자를 더한다.

그리고 다시 ulSum을 더하고 그것을 반전시킨 값을 반환한다.

checksum은 ip헤더가 변경되었는지 되지 않았는지를 체크하는 것이다. 위의 smart_cksum함수는 그것을 체크하기위한

알고리즘이고 위의 printf문에 의해 조건연산을 하여 확인이 되면,ok, 그렇지 않으면 fail을  화면에 출력된다.


그리고 src와 des부분. ip에도 보내고 받는 주소를 나타낸다. 먼저 ip에서는 먼저 보내는 source ip adress가 먼저 나와있다. 헤더파일에서 src와 des부분에 해당하는 파일을 보고 printf문으로 찍어낸다. ip는 "192.000.00.xx"자체가 문자열이므로 %s로 찍어내는데 문제는 ip를 네트워크상의 문자를 아스키코드 문자로 변환하여야 한다. 그래서

inet_ntoa()함수를 쓰고 인자에 stIp->src와 stIp->des를 썼다. printf문을 2개씩 나누어 사용한 이유는 한줄에 쓴다면

ip주소를 덮어쓰기 때문이다. inet_ntoa()함수에 원형에는 static변수가 선언이 되어있으며, ip주소를 저장하는 buffer가 존재한다. static변수는 한 번만 초기화된다. 그래서 src에서 ip주소를 받아서  버퍼에ㅣ 쓰면, des에서 받는 ip주소가 출력이

되어야 하는데 static변수에 의해서 이전의 ip가 그대로 buffer에 덮어버린다. 그래서 printf문을 나누어서 사용하였다. 





아래의 L3_TCP함수를 주목한다. 

tcp헤더부분을 완성시키기위한 함수를 만든것이다. 아래의 그리미을 보면, sourceport와 

destination port가 있다. 

tcp.h헤더파이을 참조하여 구조체 포인터형 변수 *stTcp를 만들었다. 그리고 바로 이것을 void형 vp를

캐스팅하여 대입한다. 

그리고 printf문으로 각각, source와 dest를 화면에 출력하였다.



















반응형
Comments