nibble | byte의 절반. 4bit | 0x0 ~ 0xF (0~15) |
byte | memory addressing 단위. 8bit | 0x00 ~ 0xFF (0~255) |
- 우분투 18.04 wireshark 실습 (sudo wireshark)
- 먼저 빨간색 버튼을 눌러 패킷을 멈추고, 톱니바퀴를 눌러서 가장 많이 보이는 포트의 브라우저의로부터의 패킷을 차단하기 위해 해당 브라우저의 UDP port를 입력한다. (특정 브라우저로부터의 패킷을 확인하기 위해)
=> not udp port 4660
- 차단 후 http 입력. 다시 브라우저를 새로고침하면 원하는 브라우저로부터의 패킷 확인 가능
- TCP 헤더의 Dest port에 4660이 아닌 hex 값 0x1234를 넣고 패킷을 보낸다. 보낼 때는 0x1234로 보낸다.
이것을 네트워크 바이트 오더(Network Byte Order)라고 한다.
하지만 이를 메모리에 넣을 때는 little endian 방식으로 들어간다.
0x1234는 0x3412로 메모리에 들어가는 것이다.
이는 Host Byte Order(호스트 바이트 오더)로 변환됐다고 한다.
따라서 NBO(Network Byte Order)와 HBO(Host Byte Order) 변환하는 방법을 알고있어야 한다.
먼저 4660이라는 숫자가 메모리 상에 어떻게 존재하는지 확인해보자.
16bit의 경우와 32bit 경우가 다르다.
- AABB가 있으면 AA00, BB00으로 먼저 나눈다. (byte 단위로)
- bit mask 필요: 오버헤드를 줄이기 위해 사용. 있으면 1, 없으면 0으로 표현,
uint16_t my_ntohs(uint16_t n)
{
uint16_t n1 = (n & 0xFF00); // 0x1200
uint16_t n2 = (n & 0x00FF); // 0x0034
uint16_t n3;
printf("%04x\n", n1);
printf("%04x\n", n2);
n1 = n1 >> 8; //0x12
n2 = n2 << 8; //0x3400
printf("%04x\n", n1);
printf("%04x\n", n2);
n3 = n1|n2;
printf("%04x\n", n3);
return (n1 | n2);
}
- 그냥 출력 시 0x78563412로 출력되는데, little endian으로 메모리에 넣어서 0x12345678이 출력되도록 한다.
uint32_t my_ntohl(uint32_t n)
{
uint32_t n1 = (n & 0xFF000000); //0x12000000
uint32_t n2 = n & 0x00FF0000; //0x340000
uint32_t n3 = n & 0x0000FF00; //0x5600
uint32_t n4 = n & 0x000000FF; //0x78
uint32_t n5;
printf("%x %x %x %x\n", n1, n2, n3, n4);
n1 = n1 >> 24; // 0x12
n2 = n2 >> 8; // 0x3400
n3 = n3 << 8; // 0x560000
n4 = n4 << 24; // 0x78000000
n5 = n1|n2|n3|n4;
printf("0x%x 0x%x 0x%x 0x%x\n", n1, n2, n3, n4);
printf("0x%x\n", n1|n2|n3|n4);
}
- 메모리 상 위치를 확인해보면 스택이 작은 주소로 자라므로 n4 | n3 | n2 | n1 각각에 0x78, 0x56, 0x34, 0x12가 잘 들어가 있다.
16bit 숫자 입력 + 출력 실습
void write_0x1234() {
uint8_t network_buffer[] = { 0x12, 0x34 };
uint16_t* p = reinterpret_cast<uint16_t*>(network_buffer);
//uint16_t n = my_ntohs(*p); // TODO
uint16_t a;
scanf("%hx", &a);
//uint16_t n = ntohs(*p);
uint16_t n = ntohs(a);
printf("16 bit number=0x%x\n", n);
}
화살표한 부분이 입력인데, 3412로 입력을 할 경우, 1234로 출력된다.
[구글 애드센스] 구글 애드센스 심사에 통과되다 (0) | 2020.12.23 |
---|---|
우분투 oh-my-zsh 설치 및 agnoster 설정(multi line, syntax-highlighting, autosuggestion) (1) | 2020.08.28 |
Ubuntu 18.04 LTS 환경설정(pwntools, pwndbg, one gadget, vim, vmware tools) (1) | 2020.06.10 |
Ubuntu 18.04 LTS bridge 네트워크 설정 (0) | 2020.06.09 |
우분투에서 32bit로 컴파일하는 방법 (0) | 2020.06.07 |