본문 바로가기

망각/Network

TCP 패킷 조작

TCP 패킷 조작

네이트온 채팅 메시지를 조작하려면, 네이트온 패킷 통신에서 살펴본 채팅 패킷 태그와 속성, 채팅 글을 변경하면 된다. (물론 암호화돼있다면 GG)

네이트온이 TCP 프로토콜을 사용하기 때문에 TCP 데이터 부분만 변경한다고 조작한 패킷이 서버에 도착해 받아들여지는 것이 아니다.

서버는 도착한 TCP 데이터에 대해 TCH 헤더에 있는 checksum(검사합)으로 패킷의 훼손 유무를 판단한다. 중간에 조작된 TCP 데이터는

처음에 송신지에서 계산된 체크섬으로는 서버에서 훼손됐다 판단해 받아들여지지 않는다.


그렇기 때문에 중간에 패킷(데이터와 헤더 어느것이건)를 조작하면,   조작된 패킷으로 다시 검사합을 계산하고 헤더에 넣어줘야 한다.

TCP 데이터 조작시, 데이터의 길이가 달라지면, IP 헤더의 검사합까지 재계산해줘야 한다. 조작된 TCP 데이터의 길이에 변화가 없다면

IP 헤더의 검사합을 재계산할 필요는 없다.


IP와 TCP 헤더의 계산 방법은 2바이트 단위씩 잘라 1의 보수 덧셈을 하는 건 똑같다.

하지만, IP 검사합은 IP 헤더만 계산하고 TCP 검사합은 TCP 헤더, TCP 데이터와 TCP검사합임의헤더를 계산범위에 포함한다.


자세한 설명은 생략하고 코드를 보자.


unsigned short CalcTcpChecksum(const byte * pSrcIp, const byte * pDstIp, const byte * pTcp, unsigned short nTcpLen) {
 // NOTE/ Big-endian - byte order

 unsigned int nSum = 0;

 // add part of tcp pseudo header
 nSum += (pSrcIp[1] << 8) + pSrcIp[0];
 nSum += (pSrcIp[3] << 8) + pSrcIp[2];

 nSum += (pDstIp[1] << 8) + pDstIp[0];
 nSum += (pDstIp[3] << 8) + pDstIp[2];

 nSum += 6 << 8; // TCP protocol
 nSum += htons(nTcpLen);

 int i = 0;


//  덧셈시 little-endian으로 해석해서 더함

unsigned short * pBuffer = (unsigned short *) data;


 for (; i < nTcpLen - 1; i += 2) {

  nSum += (pTcp[i+1] << 8) + pTcp[i];

 // ==

 }

 if (i < nTcpLen)
  nSum += pTcp[nTcpLen - 1];


 while (nSum >> 16) {
  nSum = (nSum >> 16) + (nSum & 0xffff);
 }

 return (unsigned short) ~nSum;
}



동일한 결과를 내는 다른 소스이다.

unsigned short * 으로 포인터 변환을 해 한번에 2byte 계산을 한다.

unsigned short 으로(2바이트) 자동 변환시 little-endian 으로 읽혀 더해진다.


unsigned short * pBuffer = (unsigned short *) data;

 //Calculate the checksum
 while (iSize>1) // iSize 는 바이트 갯수

 {
  usChksum+=*pBuffer++;
  iSize-=sizeof(unsigned short);
 }

 //If we have one char left
 if (iSize)
  usChksum+=*(unsigned char*)pBuffer;

 //Complete the calculations
 usChksum=(usChksum >> 16) + (usChksum & 0xffff);
 usChksum+=(usChksum >> 16);

 //Return the value (inversed)
 printf("0x%04X\n\n", (unsigned short)(~usChksum));



장이는 big, little-endian 부터 덧셈 계산시 비트순 때문에 정말 힘겨운 체크섬 세월을 보냈다.


이 글은 스프링노트에서 작성되었습니다.

'망각 > Network' 카테고리의 다른 글

네이트온 패킷 통신  (0) 2007.05.25
LAN 안의 노드들 MAC 알아내기  (0) 2007.03.20
ARP 스푸핑 및 IP 하이재킹  (0) 2007.03.18
[MAC] FF:FF:FF:FF:FF:FF mac 주소  (0) 2007.03.12
about things with packet  (0) 2007.02.03