Piki's Play
Chapter2. 컴퓨터 기초 (1) 본문
우선 이번에 배울 것은 기본동작들에 대한 것들이다.
순서 : Data-> Disk -> 2진수,10진수,16진수 -> 부팅순서, 코드 -> 하드디스크, 위치 ATA,HPA,SCSI
2.1 데이터 구성
-> 조사 대상 장치들의 목적은 디지털데이터를 처리하는 것이다.
▶ 2진수, 10진수, 16진수
진법에 대해 이야기하기 이전에 컴퓨터에 대해 이해가 필요하다.
보통 컴퓨터는 0과 1로 이루어져 있다고 하는데 이것이 2진수 이다.
01011101...... 이런것들을 많이 보았다. 그리고 각 자리를 비트라고 하는데
즉, 1비트=0or1이 되는셈이다.
또한 1바이트= 8비트로 이루어져있다. 즉, 0000 0000 이 8자리가 1바이트가 되는 것이다. 따라서 1바이트는 2^8개를 표현할 수 있다.
이제 16진수를 보자. 2진수가 0or1인것을 생각하면 한자리에 2개의 표현이 들어갈 수 있다는 의미가 된다.
따라서 16진수는 한자리에 16개의 표현이 들어갈 수 있다고 생각하면 쉽다. 우리가 흔히 사용하는 수체계를 보면 한자리에 0~9까지의 수가 있다. 하지만 16진수는 9이상이 필요하므로 그 위는 알파벳 순서로 쓴다.
즉 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F (총 16개) 로 한자리씩 표현을 할 수있다.
우리는 16진수를 Ox00 과 같이 표현을 하고자 한다. 예를 들어 Ox06이면 10진수로 6으로 표현할 수 있다.
Ox0F= 15이 되고 Ox10=16이 되는것을 자연스레 확인할 수있다.
한단계 더 나아가 생각해 보자
16진수에서 각 자리가 16개의 표현을 가질 수 있다고 했는데 16=2^4이므로 각자리는 2진수로 바꾸면 0000~1111(총 16개) 로 표현이 된다고 확장할 수 있다.
따라서 위에 Ox0F=15=0000 1111 로 쓸 수 있다.
Ox10=16=0001 0000 로 표현이 가능한 것이다.
머리아프겠지만 한번만 더 확장을 해보자. 아까 위에서 0000 0000 (8비트)= 1바이트라고 했던 것을 생각해보자.
그렇다면 Oxoo = 0000 0000 = 1바이트 로 볼수있다. ( 잘기억하자 1바이트는 16진수로 Oxoo꼴이다. )
▶ 데이터의 크기
데이터가 존재하려면 데이터가 저장될 공간의 위치를 할당해 주어야한다.
Ox12345678 의 값을 가지는 데이터가 있다고 가정하자
우리는 저장공간의 특정위치(80~83)에 데이터를 저장할 것이다.
(각 칸은 바이트를 의미한다.)
79 | 80 | 81 | 82 | 83 | 84 | 85 |
빅 엔디안 : 리틀 엔디안 : |
12 78 |
34 56 |
56 34 |
78 12 |
생소한단어가 보인다. '빅 엔디안', '리틀 엔디안'
Ox12345678 의 데이터를 넣고자했고 위에서 설명했듯이 16진수에서 두 자리당 1바이트 이므로 각 바이트공간에 두자리씩 들어가는 것을 확인할 수 있다.
하지만 넣는 순서에 대해서는 시스템마다 다르다.
빨간색으로 표시한것처럼 큰자리수부터(최상위 비트부터) 넣는 것을 '빅 엔디안'이라 부른다.
파란색으로 표시한것처럼 작은자리수부터(최하위 비트부터) 넣는 것을 '리틀 엔디안'이라 부른다.
※ 보통 64비트를 가지는 시스템들은 '리틀 엔디안'을 이용한다. (리틀<->빅 으로 변환을 위해서는 재정리가 필요하다.)
▶ 스트링과 문자 인코딩
위에서 설명한 것과 같이 숫자는 Ox12342210 식으로 저장되며 빅엔디안과 리틀엔디안의 규칙으로 저장이된다.
하지만 문자는 1바이트를 가지고 한 문자씩 저장되기 때문에 엔디안이 적용되지않는다.
보통 단어는 한문자로 이루어지지 않는다. AIR를 예로 들면 A I R 을 각각 저장하되 연속된 공간에 집어넣는다. 이것이 바로 String의 원리이다. (마지막은 NULL이들어감)
79 | 80 | 81 | 82 | 83 |
A | I | R | NULL(/0) |
컴퓨터는 숫자로 이루어져있다. 따라서 각각의 알파벳을 숫자로 표현해서 집어넣는다.
그렇다면 어떠한 기준으로 알파벳을 숫자로 표현할까?
Hex 부분을 보자 A = 41, I = 49, R = 52임을 알 수 있다. (NULL=00)
따라서 AIR이라는 문자열은
41 49 52 00 이렇게 저장이된다.
하지만 알파벳으로 모든것을 표현하기에는 지구상에 언어가 너무많다. 따라서 Ascii를 넘는 다양한 방식들이 나온다.
§ UTF -32 (8x4=4바이트) : 각 문자를 4바이트 단위로 표현한다는 의미
UTF - 16 (2바이트) : 2 4 바이트 가능
UTF - 8 (1바이트) : 1 2 4 바이트 다 가능
UTF16, UTF8은 가변바이트를 이용해서 유동적으로 사용이 가능하다. (알파벳일때는 1바이트 쓰는 식으로)
▶ 데이터 구조체
만약 데이터를 편지라고 생각하면 어디로가는지 알아야한다. 따라서 어디로 가야하는지 번지와 거리명을 알아야한다.
보통 위처럼 32바이트는 번지와 거리를 위해 사용한다.
0~1 / 번지수를 위함
2~31 / 거리를 위함
1번지 Main St. 으로 가야하는 편지가 있다고 보면 다음과 같이 도구를 통해 데이터를 얻을 수 있다.
00000000 : 0100 4d61 696e 2053 742e 0000 0000 0000 0000 ..MainSt.......
00000016 : 0000 0000 0000 0000 0000 0000 0000 0000 0000 ......................
해석 :
1. 번지수가 들어가는 0~1 공간 2바이트 임으로 Ox0000의 공간인데 위에서 1번지라 했으니 Ox0001로 표현이 가능하다. 그런게 막상보면 0100으로 들어가 있는 것을 알 수 있고 위에서 배운 '리틀 엔디안'이 사용되었음을 알아낼 수 있다.
2. 앞에 표현된 00000000과 00000016은 10진수로 크기를 나타내주는 '오프셋'이다.
3. MainSt은 위에 ASCII코드를 참고해보면 엔디안 적용없이 순서대로 들어가있음을 볼 수 있다.
(예시로 편지처럼 이야기했지만 일반적인 파일시스템도 원리는 같다.)
▶ 플래그 값
-> 일부데이터를 1이나 0으로 표현해서 그것들의 존재여부를 확인하는 값이다.
즉 OX나 True false를 알고싶을 때 사용하는 값
여기서 한가지 문제가 생긴다. 우리는 보통 바이트의 단위로 저장을 하는데 플래그는 0or1만 필요하다. 딱 1비트만 필요한것이고 이것을 바이트에 저장시에는 손해가 있다.
플래그 보는 법 : 플래그공간에 Ox61이 저장되어있다고 하자. Ox61 = 0110 0001 이고 이때 최하위 비트가 1이면 참으로 본다. 즉, 2진수로 변환후 최하위비트를 보면 된다.
2.2 부팅과정
-> 컴퓨터 동작을 위해서 필수데이터를 가져오는 과정으로 보면된다.
이 필수데이터를 가져오기 위한 명령어를 = '부트코드' 라고한다. 디스크의 여러공간에 있다.
▶ 중앙처리장치와 기계어
CPU (Central Processing Unis, 중앙처리장치) 는 컴퓨터의 핵심이고 명령어의 입력이 필요하다. 그리고 메모리에서 명령어를 가져오는 역할을 수행한다.
다음은 기계어를 알아보자.
각 기계어 명령어는 앞 몇바이트에 opcode라는 명령어 유형을 가진다.
예를들어 opcode OxB400 = Mov AH 00 를 나타내고 값 00(뒤에00)을 AH레지스터로 Mov(이동)하라는 의미이다.
▶ 부트 코드 위치
(여기는 정리한 것을 바탕으로 한다.)
윈도우를 예로 들면 전원을 키면 CPU는 BIOS로부터 명령어를 읽어들인다. 그리고 하드디스크, CD드라이브, 다른 하드웨어의 위치를 알아낸다. 이후 BIOS는 설정된 순서대로 하드웨어를 검사해서 첫 번째 섹터를 확인한다. 첫 번째 섹터의 부트코드를 CPU가 처리하여 윈도우 운영체제가 위치한 부팅가능한 파티션의 위치를 알아낸다.
실제로 첫 번째 섹터에 실제 운영체제를 적재하는 많은 부트 코드를 가지고 있다.
p.s 내일은 하드디스크 기술에 대해 정리하고자 한다.
'포렌식 > 파일시스템 (파일시스템 포렌식분석)' 카테고리의 다른 글
(Part 2) Chapter 4 볼륨분석 (0) | 2020.01.29 |
---|---|
Chapter 3. 하드디스크 데이터 수집 (0) | 2020.01.22 |
Chapter 2. 컴퓨터 기초 (2) (0) | 2020.01.18 |
(Part 1 기초) . Chapter 1. 디지털 조사 기초 (0) | 2020.01.14 |
0. 시작 (0) | 2020.01.11 |