1. BIT, BYTE, 파일 그리고 Hash

기초 중에 기초! bit와 데이터의 표현을 알아봅시다. 실습의 경우 굳이 하지 않으셔도 됩니다.

실습 도구

1. BIT

  • 디지털 정보(0 과 1) 을 표현하는 단위 1 bit는 오직 0 또는 1만 저장 2bit의 경우 00, 01, 10, 11 4가지를 표현할 수 있습니다.

3bit를 이용하여 표현 할 수 있는 경우

  • 4비트로 표현 할 수 있는 범위(0~9,A~F) 하단의 Binary 의 경우 1자리에 0 또는 1만 표시할 수 있을 경우 4비트를 하나의 문자로 표현이 가능합니다.

  • 또한 1바이트로 표현하는 것이 16진수를 활용하여 표기에도 용이 합니다.

2. BYTE와 글자의 표현

  • 8bit = 1byte 왜 하필 8 비트인가? 0000 0000 ~ 1111 1111 ( 256 가지 표현 가능)

  • 숫자 10개(0~10), 영어 대문자 26개, 영어 소문자 26개 = 62개 글자 표현을 위해선 최소 64개를 표현할 수 있는 6비트 이상이 필요

  • 그렇다면 6비트만 써도 되겠지만.. 특수기호(!, “, ‘, @, #, $) 를 포함하려면 더 필요 -> 7비트를 사용한다면 총 128개 표현 가능.

  • 그리고 오류검출용 코드를 1비트를 포함하여 총 8비트를 사용 ⇒ 아스키 코드

  • 한글의 표현 - 1bytes 만으로는 한글의 모든 글자를 표현하기 어렵기 때문에 최소 2 bytes 이상으로 만듬 2bytes = 16 bit = 2의 16승 (65,536 가지 표현 가능 0000 0000 0000 0000 ~ 1111 1111 1111 1111) CP949 한국어판 윈도우 기본 코드 페이지. https://charset.fandom.com/ko/wiki/CP949 - 문자집합 위키 cp949 엑셀표 - 출처(https://anow.tistory.com/240)

  • 글자의 표현 실습

    • 메모장을 실행 한 뒤 원하는 글자를 작성 후 파일을 저장하여 봅시다. 저장할 때 인코딩을 ANSI (CP949)로 설정하여 저장하여 봅시다.

      HxD를 이용하여 해당 파일을 열어보면 bit의 나열이 16진수로 표현되어 있습니다. 2바이트씩 묶어서 CP949 코드표를 찾아보면 해당하는 한글을 확인할 수 있습니다.

3. 파일

  • 파일의 개념은 다양하게 해석할 수 있지만 간단히 저장 공간에 bit가 모여있는 것을 하나의 파일로 생각하면 됩니다.

  • 단순히 아무 것도 없이 "00" 이라는 1바이트를 저장한 것도 하나의 파일이고, 엄청난 용량의 동영상도 하나의 파일입니다.

  • 문서 파일, 그림 파일 등 다양하게 있지만, bit가 모여 있는 것을 어떻게 보여주냐에 따라서 문서 파일이 될 수 있고, 그림 파일이 될 수 있습니다.

4. 리틀엔디안과 빅엔디안

  • 엔디안은 메모리에 여러 바이트 데이터를 어떤 순서로 저장할지를 정한 CPU·메모리 구조상의 규칙입니다. 즉, “데이터의 본질”이 아니라 “저장 방식”의 차이로 생긴 개념입니다.

  • 컴퓨터는 데이터를 바이트 단위(8비트) 로 저장하지만, 정수나 실수 같은 값은 여러 바이트(예: 4바이트, 8바이트) 로 구성되는데 “그 여러 바이트를 메모리에 어떤 순서로 저장할까?” 이걸 정한 게 엔디안(Endian) 규칙입니다.

  • 먼저 결과부터 보겠습니다. HxD로 봤을 때 4바이트 정수 12 34 56 78을 저장한다고 하였을 때 빅엔디안 : 12 34 56 78 (16진수) -> 305,419,896 (10진수) 리틀엔디안 : 78 56 34 12 (16진수) -> 2,018,915,346 (10진수)

    [계산기 사용법] 계산기를 실행한 뒤 메뉴바에서 프로그래머를 선택 후 Hex 선택 한 다음 16진수를 입력하면 HEX(16진수-4bit), DEC(10진수), OCT(8진수-3bit), BIN(2진수-1 bit) 선택하면 진수 변환이 가능합니다.

  • 정리하면 빅엔디안은 평소 우리가 숫자를 읽는 순서와 같은 방식으로 데이터를 저장하는 구조입니다. 리틀엔디안은 저장된 바이트(8비트) 기준으로 역순으로 저장하는 구조입니다.

  • 앞으로 실습 등에서 이러한 bit의 나열을 8bit 기준으로 2개의 hex값을 많이 해석하게 되는데 이때 리틀 엔디안을 빅엔디안, 10진수로 변환 후에 우리가 이해하기 쉬운 숫자로 확인하는 것이 반복될 것이고 포렌식 많은 도구 등이 이러한 작업을 쉽게 해주고 있습니다.

5. 메타데이터와 데이터 영역

  • 파일이 저장된 공간은 저장매체에서 데이터 영역에 포함됩니다. 그렇다면 메타데이터 영역과 데이터 영역은 무엇일까요?

    • 메타데이터

      • 파일의 이름·크기·저장 위치 같은 정보를 보관하는 부분입니다. 이 영역 또한 데이터로 0101 ~~ 비트의 나열로 저장하게 됩니다. (우리가 쉽게 생각하는 속성 정보)

      • 메타데이터 구성 방식은 파일시스템마다 달라지게 되는데 추후에 알아보도록 하겠습니다.

    • 데이터

      • 실제로 데이터가 저장된 공간입니다. HxD에서 확인한 부분이 바로 이 데이터 공간에 있는 데이터를 확인한 것입니다.

      • 그래서 데이터를 복사한다는 것은 데이터 영역의 bit의 나열을 복사한 뒤 새로운 메타데이터로 구성되고 메타데이터가 가리키는 새로운 데이터 영역에 bit의 나열을 동일하게 덮어쓴 것인 것입니다.

Hex Editor (HxD)어떤 프로그램일까?
  • HxD 뿐만 아니라 다양한 Hex Editor 프로그램이 존재 합니다. 이 프로그램이 추후에도 다양하게 활용되어 많은 기능이 있는 프로그램으로 오해할 수 있으나 아주 단순한 프로그램입니다.

  • HxD의 경우 열기한 파일의 데이터 영역의 파일의 bit의 나열을 Hex (16진수) 값으로 표시해주고 수정 저장하는 기능을 가진 프로그램입니다.

  • 예를 들어 맨 앞에 81 hex 값으로 저장된 값이 있다면 아래와 같이 해석하여 우측 데이터 변환기에서 자동으로 계산을 해주는 것입니다.

  • 16의 경우 2바이트 81 00 , 32의 경우 4바이트 81 00 01 00을 계산해 보여줍니다. 81 00(리틀엔디안) -> 00 81 (16진수) = 129(10진수) 81 00 01 00 -> 00 01 00 81 = 65,665

  • Hex Editor의 경우 파일, 디스크 전체의 데이터 영역에 있는 비트의 나열을 Hex 값으로 보여주고 이를 수정하여 bit의 나열중 bit 값을 변환하여 저장하게 해주는 것 입니다. 파일이나 파일시스템 등을 복구하는건 이를 활용하여 구조에 맞게 bit의 나열을 다시 수정하여 되돌리는 것이지 Hex Editor이 자동으로 무엇인가를 해주는 것은 아닙니다.

6. HASH

  • 입력 데이터(bit)가 어떤 값이든 간에 출력 결과는 고정된 길이의 bit를 출력하는 값 다만, 입력 데이터의 1bit 만 달라져도 출력 데이터는 완전 다른 값이 출력 됩니다. (해시, 해시값, 체크썸 등등.. 으로도 불린다.)

  • 알고리즘 종류 : md5, sha, sha-256, sha-512 등등.. - md5(128 bit의 출력) → 128bit → 16진수로 32자리 128 / 4 = 32자리

  • Windows Power Shell get-filehash 로 실습해보기

  1. HxD를 이용하여 파일을 생성하여 봅시다. HxD에서 파일 - 새로 만들기 또는 새로 만들기 아이콘 선택 후 "00 00" 값을 넣고 저장하여 봅시다. (파일명은 아무거나 상관 없습니다.)

  2. MD5로 “00 00”의 데이터를 가진 파일을 MD5 알고리즘으로 계산하였을 때 나오는 결과값을 알아봅시다. 테스트할 파일이 있는 폴더에서 shift 누른 상태에서 우클릭 - [여기에 PowerShell 창 열기] 선택합니다.

  3. 아래 명령어를 입력하여 봅시다. get-filehash “파일명” -algorithm md5 해시값이 아래와 같은 값을 확인할 수 있을 것입니다. C4103F122D27677C9DB144CAE1394A66 (128비트 = 4비트 32자리) 값을 확인할 수 있습니다.

  4. 만약 1이라도 바뀐다면 어떻게 되는지 살펴봅시다. 마지막 비트를 1로 변경하여 봅시다. 00 00 (16진수 Hex) => 0000 0000 0000 0000 (bit) 00 01 (16진수 Hex) => 0000 0000 0000 0001 (bit) 이후 다시 같은 명령어를 입력하여 Hash 값을 비교하여 봅시다. > 441077CC9E57554DD476BDFB8B8B8102 (128비트 = 4비트 32자리)

  5. 다시 원래대로 수정하여 해시값을 비교하여 봅시다. > C4103F122D27677C9DB144CAE1394A66 다시 처음과 같은 값

  • 다만 해시값만 가지고는 원본이 무엇인지 정확히 알 방법이 없습니다. 이러한 특성을 이용하여 bit의 묶음(파일 등등..)이 변경되지 않았음 입증하는데 활용하고 있습니다.

  • 포렌식 도구에서는 이런 해시값 계산 기능이 기본으로 있으니 시험에 있어서 powershell 의 get-filehash 명령어는 굳이 외외서 사용할 필요는 없습니다.

그렇다면 파일을 복사 붙여넣기(Ctrl + C, Ctrl + V)한 파일은 해시값이 동일할까?
  1. 아래와 같이 파일을 하나 생성 한뒤 복사 붙여넣기를 통해 복사본을 만들고 HxD를 이용하여 두 파일의 데이터를 비교해보겠습니다.

  2. get-filehash 를 이용하여 두 파일을 비교해보겠습니다. 동일한 값을 확인할 수 있습니다.

  3. 메타데이터를 비교해보면 만든날짜가 분명히 다른데 같은 해시값을 가집니다.

  4. HxD로 동일한 데이터의 파일을 하나 만들어 보겠습니다. 그리고 해시값을 계산해보면 여전히 동일한 것 입니다.

  • 정리하면 결국 우리가 복사 붙여넣기 하는 것은 데이터 영역을 그대로 복사하는 것이고, 해시값을 계산할 때 데이터 영역을 대상으로 해시값 계산을 하게 되기 때문에 동일한 bit의 나열을 갖고 있어서 같은 해시값이 나오는 것입니다.

  • 그렇다면 메타데이터는 해시값 계산을 하지 않는 상황입니다. 따라서 이후 메타데이터까지 같이 수집을 해야 정확하게 속성정보까지 수집을 하는 것으로 이후에 실습하게될 이미지 생성 등을 하게 될 것입니다.

3줄 요약

  1. 대부분의 Hex, 포렌식 도구는 bit를 8개를 묶어서 16진수 값(Hex)으로 표현합니다. byte로 저장된 데이터에 규칙을 정해서 글자를 표현합니다.

  2. 파일은 bit의 나열이며 여러 프로그램들이 파일의 구조를 기반으로 읽고 쓰고 저장합니다. 다만 메모장의 경우 다른 구조가 없이 데이터를 hex로 저장하고, 열어볼 수 있습니다. (용량이 큰 파일은 메모장으로 열리지 않습니다.)

  3. Hash 값은 1bit만 바뀌어도 다른 값을 표시합니다! 같은 알고리즘만 쓴다면 어떤 프로그램 등을 사용하여도 동일한 값이 나오게 됩니다.

+ @(시험 외 공부용)

시험 범위를 벗어나 더 공부해보고자 하시면 참고하세요.

Last updated