C||C++

독되C-1

Yongbaldae 2023. 4. 30. 01:06

Endian과 메모리

int a = 0x0011223344;

여기서 0x는 16진수를 나타내는 접두사이다.

int b = 012; 

여기서 012는 접두사 0으로 인해 8진수로 인식되며, b에는 십진수 10이 할당된다.

 

바이트 순서는 크게 빅 엔디언과 리틀 엔디언으로 나눌 수 있다.

빅 엔디언은 사람이 숫자를 쓰는 방법과 같이 큰 단위의 바이트가 앞에 오는 방법이고,

리틀 엔디언은 반대로 작은 단위의 바이트가 앞에 오는 방법이다.

엔디언의 표현

안타깝게도 Intel에서 little-endian을 채택한다...

이러한 엔디언은 debug를 위해서, 또한 network작업을 위해서 꼭 필요한 상식이다.

위와 같은 코드를 디버그해보자.(4번줄 클릭후 f5).

아직 a에는 값이 할당되어있지 않은 상태이다. 아마 쓰레기값일 것이다.

f10을 눌러서 한 줄 더 디버그해보자.

little-endian방식으로 메모리에 저장되어 있는 것을 확인할 수 있다.

만약 int a = 0x01234567; 이라면, 아래와 같이 메모리에 저장된다.

강의에서 신기한 점을 배울 수 있다.

분명 위의 상황에서는 a의 메모리에 little-endian 형식으로 값이 알맞게 들어있다.

 

그런데 만약 메모리를 내가 직접 타이핑해서 바꾸면 어떻게 될까?

코드는 분명히 int a = 0x1234567; 이라고 되어있지만, 메모리상으로는 0x11223344로 입려되어있고,

실제로 출력도 0x11223344로 출력된다.

이게 해킹이란다.... 처음 알았다.

나중에 프로그램이 멈췄을 때,  프로그램을 살려야 할 경우에는 직접 메모리값을 조작하면 안죽고 돌아가게 만들 수 있다.