Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

Piki's Play

Chapter2. 컴퓨터 기초 (1) 본문

포렌식/파일시스템 (파일시스템 포렌식분석)

Chapter2. 컴퓨터 기초 (1)

Pikigod 2020. 1. 16. 17:35

우선 이번에 배울 것은 기본동작들에 대한 것들이다.

순서 : 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)

컴퓨터는 숫자로 이루어져있다. 따라서 각각의 알파벳을 숫자로 표현해서 집어넣는다.

그렇다면 어떠한 기준으로 알파벳을 숫자로 표현할까?

Ascii 코드표

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 내일은 하드디스크 기술에 대해 정리하고자 한다.