본문 바로가기

IT/리버스 엔지니어링(Reverse Engineering)

리버스 엔지니어링(Reverse Engineering) 0과 1로 이루어진 세계(1)



관련 포스팅

1. 리버스 엔지니어링(Reverse Engineering)이란?

2. 리버스 엔지니어링(Reverse Engineering) 0과 1로 이루어진 세계(1)

3. 리버스 엔지니어링(Reverse Engineering) 0과 1로 이루어진 세계(2)





■ 2진수 10진수 16진수


[리버스 엔지니어링(Reverse Engineering)이란?] 에서 컴퓨터가 0과 1로 어떻게 이루어지는지 언급한 바 있습니다.


컴퓨터에서 데이터를 표현함에 있어 0과 1로 이루어지는 이유는


전기의 흐름 또는 흐르지 않음


자기장의 N극 또는 S극(하드디스크)


다음과 같은 물리적 특성을 기반으로 데이터를 표현하기 때문입니다.


그렇다면 우리는 0과 1로 이루어진 정보를 읽을 줄 알아야만 컴퓨터 내부의 약속된 신호체계에 대해 파악할 수 있을 것입니다.


어떻게 0과 1로 이루어진 정보를 파악할 수 있을까요?



그러기에 앞서 간단한 수학적 지식을 필요로 합니다. (어렵지 않으니 무서워 마세요.)



가장 직관적으로 이해할 수 있는 10진수를 이해해보겠습니다.


우리가 일상적으로 사용하는 숫자가 10진수입니다. (손가락도 10개, 발가락도 10개이기 때문일거라는 생각이드네요.)



10진수는 10을 기반으로 하는 숫자체계로서, 우리가 일상적인 생활에서 데이터를 표현하기 위해 사용되는 방식입니다.


10진수 '0', '1, '2', '3', '4', '5', '6', '7', '8', '9' 라는 10가지 종류의 숫자로만 구성되어있습니다.


우리의 일상사례를 통해 생각해보시면 이해가 더 깊게 오실것입니다.


생각해보면 숫자9 다음에 숫자10으로 넘어가게 됩니다.


결과적으로는 '9'라는 표현방식으로 데이터를 표현하다가 더이상 데이터를 표현할 수 없으므로 자리수를 증가시켜 '1'과 '0'을 이용하는 방식이며


이는 총 10가지 종류의 숫자로 세상의 모든 수를 표현하기에 10진수라고 불리우는 이유입니다.



그렇다면 이제 컴퓨터에서 데이터를 표현하는 방식으로 2진수를 알아볼까요?



2진수는 2를 기반으로 하는 숫자체계로서, 컴퓨터 내에서 데이터를 표현하기 위해 사용되는 방식입니다.


2진수'0'과 '1'이라는 오직 2가지 종류의 숫자로만 구성되어있습니다.


2진수를 이용하여 숫자 10까지 표현해보겠습니다.







다음과 같이 표현이 가능합니다.


10진수에서 1에서 2로 숫자가 증가할 때


2진수에서는 '2'를 표현할 수 없으므로 숫자가 10으로 표현된다는 사실에 집중한다면 보다 쉽게 2진수에 대하여 이해할 수 있을것입니다.




그렇다면 16진수는 무엇일까요?


16진수는 16을 기반으로 하는 숫자체계로서, 컴퓨터 내에서 데이터를 표현하기 위해 사용되는 또다른 방식입니다.


16진수'0', '1, '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' 라는 16가지 종류의 문자로만 구성되어있습니다.


이를 기반으로 하여 16진수를 이용한 숫자를 21까지 표현해보겠습니다.







다음과 같이 표현이 가능합니다.


10진수에서 9에서 10으로 숫자가 증가할 때


16진수에서는 숫자 10을 'A'로 표현할 수 있기에 '10'이 아닌 'A'로 표현하게 된다는 사실에 집중한다면 보다 쉽게 16진수에 대하여 이해할 수 있습니다.



그렇다면 이렇게 다소 직관적으로 이해하기 힘든 숫자 표현 체계를 왜 사용하는 것일까요?


잠시 고민의 시간을 가져봅시다...









우리가 사용하는 컴퓨터가 32비트(bit)이며 이를 기반으로 데이터를 표현한다고 가정해봅시다.


11100111100010101111111001111000


보기만 하여도 다소 난해하며, 이해할 수 없습니다.


그렇다면 보기좋게 4자리 단위로 끊어서 나타내보겠습니다.


1110 0111 1000 1010 1111 1110 0111 1000



아까보다는 나아졌지만 아직도 이를 보고 이해하기란 쉽지 않습니다.



그렇다면 이렇게 2진수로 이루어진 데이터를 보다 쉽게 표현할 방법에 대하여 고민해봐야 할 시점 입니다.




네자리 단위(비트)로 끊어진 데이터에 집중하여 봅시다.


네자리 비트로 표현 가능한 수는 2^4 = 16 입니다.


숫자 16은 앞서 배운 16진법을 이용하여 표현할 수 있으며 


16진법을 이용하여 데이터를 표현한다면 보다 직관적으로 데이터를 표현할 수 있다는 결론을 도출할 수 있습니다.



그렇다면 2진법으로 나타낸 데이터를 일련의 과정을 거쳐 16진법을 이용해 표현해 봅시다.






2진법으로 표현된 1110은 10진법으로 숫자 14이며 이를 16진법으로 다시 표현한다면 E가 됩니다.


다른 부분도 이와 같은 논리를 적용시켜 동일하게 표현할 수 있습니다.



처음에 표현하려던 데이터인


1110 0111 1000 1010 1111 1110 0111 1000 


E 7 8 A F E 7 8


다음과 같이 훨씬 간소하게 표현할 수 있습니다.


 

그렇다면 우리는 표현된 데이터를 보기 좋게 두개의 문자씩 다시 묶어보겠습니다.


E7 8A FE 78



복잡했던 데이터가 훨씬 간결하게 표현되는 사실을 알 수 있습니다.


한가지 더 설명드리자면 이렇게 총 8비트(bit) 단위로 묶은 것을 1바이트(Byte)라고 합니다.


그렇다면 위의 데이터는 총 4바이트의 데이터를 나타낸 것이라는 사실을 알 수 있습니다.


[Bit와 Byte의 차이점]


추가적인 정보를 알고 싶은 분을 고려하여 비트와 바이트에 관한 개념은 링크로 대신하겠습니다.




오늘은 컴퓨터에서 표현된 데이터를 읽기 위한 숫자표현체계에 관한 포스팅이였습니다.


다음 포스팅을 이해하기 위해서라도 꼭 필요한 개념이니 다소 이해가 힘드신 부분은 댓글을 통해서라도 꼭 이해하고 넘어가시길 바랍니다.