바이트 오더링이란?
본격적으로 웹 해킹을 시작하기 전에
비전공자 분들을 위해서 알고 있으면 도움이 되실만한 컴퓨터 과학의 내용을 소개해드리려 해요.
1. 진법
흔히 우리가 숫자를 셀 때 1,2,3,... 10 이렇게 세곤 하죠. 이렇게 숫자를 세는 방식을 10진법이라고 해요. 물론 컴퓨터가 우리처럼 10진법을 사용한다면 참 좋을 텐데, 아쉽게도 컴퓨터는 0과 1로만 숫자를 셀 수 있어요. 즉 10진법이 아닌 2진법을 사용하는데, 이 2진법을 구성하는 0과 1이 조합된 비트(bit)로 데이터를 구성하게 됩니다.
먼저 10진법으로 표현된 수를 2진법으로 바꾸는 방법을 알려드릴게요. 숫자 13을 예로 들자면, 10진법으로 나타낸 숫자 13은 그냥 13이지만, 이 13을 2진법으로 나타내는 방법은 숫자를 몫이 0이 될 때까지 계속 나눠주고, 그렇게 나온 나머지를 역순으로 읽어주면 돼요. 아래 그림을 보시면 더 잘 이해가 가실 거예요.
이제 이 나머지를 역순으로 읽어주면 1101 이 되고, 이게 13을 2진수로 나타내는 방법이에요.
물론 지금은 13처럼 비교적 작은 숫자로 했기 때문에 간단하게 나타낼 수 있었지만, 값이 커지게 되면 번거로워지기 때문에
이러한 문제를 보안하고자 16진수를 자주 사용해요.
16진수는 0~9까지 10개의 숫자와 A~F까지 6개의 문자로 수를 표현하는 방식인데요. 이러한 16진수는 2진수를 4자리씩 묶어서 한자리로 표현하는 방식으로, 역시 예시를 보면서 알아볼게요.
먼저 52를 2진수로 나타내면 110100이 되고 이 2진수를 오른쪽부터 4개씩 묶어볼게요. 그러면 11 / 0100이 되죠? 이렇게 앞에 자릿수가 맞지 않을 때는 0을 왼쪽에 더 추가해서 맞춰 주면 되고, 그러면 0011 / 0100이 되죠. 이때 0011은 3, 0100은 4를 나타내기 때문에, 52는 16진수로 34가 됩니다.
이러한 16진수는 보통 표기할 때, 앞에 0x라는 접두어가 붙은 채로 값을 표시하는 경우가 있기 때문에, 실제 그 값을 읽을 때는 접두어 뒤쪽의 값만 보시면 돼요.
2. 바이트
위에서 진법을 말씀드린 이유는, 바이트를 설명하기 위함인데요. 잠시 언급드렸었지만 아까 컴퓨터는 데이터를 비트로 구성한다고 했었죠? 이 비트는 0 or 1을 나타내며, 데이터의 최소 단위예요. 그리고 이러한 비트가 8개가 모이면 1 바이트(byte)라고 하고 이는 메모리에 저장되는 최소 단위예요. 또한 바이트 내의 한 비트당 2개의 수를 나타내기 때문에, 2^8개인 256개의 수를 나타낼 수 있죠.
그럼 이 바이트는 또 왜 알아야 하냐?
바로 우리가 앞으로 정보보안을 공부하면서 데이터를 다룰 텐데, 그 데이터가 메모리에 저장되는 방식을 알기 위해서예요.
3. 바이트 오더링
바이트에는 8개의 비트가 있는데, 이 중 특별한 비트가 있어요. 바로 맨 앞에 위치한 비트인데 이게 왜 특별한 비트인지 말씀드릴게요. 먼저 크게 맨 앞의 비트가 하는 역할은 두 가지인데, 첫 번째로 수의 크기에 가장 큰 영향을 미치기 때문이고 두 번째로는 만약 데이터가 부호가 있는 Signed 데이터라면 맨 앞 비트가 0일 경우 양수가 되고 1일 경우 음수가 돼요. 그래서 이렇게 중요한 비트인 맨 앞 비트를 최상위 비트, MSB(Most Significant Bit)라고 부릅니다. 반대로 맨 뒤에 있는 비트는 덜 중요하다고 해서 최하위 비트, LSB라고 부르기도 해요.
이러한 바이트가 2개 이상인 데이터는 메모리에 연속적으로 저장이 되는데, 이때 메모리에 정렬되는 방식이 두 방식이 있어요. 그게 아래에 있는 리틀엔디안(LE)과 빅엔디안(BE)에요. 예시로 4바이트 16진수 0x12345678을 사용해 볼게요.
3.1. 리틀엔디안
리틀엔디안은 CPU의 처리 속도를 개선하기 위해서 만들어진 방식인데요. 바이트에서 가장 작은(오른쪽에 있는) 바이트부터 맨 앞에 적어주면 돼요. 그래서 저 4바이트를 리틀엔디안 순서로 쓰면 78 56 34 12 순서가 되고 16진수로 표시하면
0x78 0x56 0x34 0x12가 되죠.
위 그림을 바탕으로 리틀엔디안의 표현을 다시 말하자면, 가장 작은 바이트부터 메모리의 낮은 주소에 저장을 하는 방식이라고 말할 수 있어요.
3.2. 빅엔디안
반대로 빅엔디안은 좀 더 직관적인 방식으로써, 네트워크 상에서 데이터 전송 시에 사용되는 방식입니다. 순서는 리틀엔디안과 반대로 바이트에서 가장 큰(왼쪽에 있는) 바이트부터 맨 앞에 적어주면 돼요. 그래서 이를 나타내면
0x12 0x34 0x56 0x78이 되죠.
리틀엔디안과 반대로 빅엔디안은 가장 큰 바이트부터 메모리의 낮은 주소에 저장하는 방식이죠.
3.3. 바이트 오더링이 왜 중요할까?
사실 앞에서 설명하면서 이미 어느 정도는 언급한 것 같지만, 실제로 정보보안 관련 작업을 할 때, 여러모로 중요한 개념이라고 할 수 있어요. 예를 들어 공격자 입장이라면, 빅 엔디안 시스템에서 리틀 엔디안 방식으로 조작해 전혀 예상치 못한 값을 사용하게 유도한다거나 이 외에도 데이터를 주고받을 때 바이트 오더링이 다르면 잘못된 데이터를 받을 수 있죠.