해당 노트는 내가 NotPetya를 분석하면서 공부했던 MBR 부분에 대해 정리하고, 다시 한번 정리하면서 부족한 부분을 채워나가려고 하는 노트다.
우선 NotPetya는 랜섬웨어인 Petya의 변종으로, 랜섬웨어가 아닌 와이퍼 기능을 가지고 있는 악성코드다. 와이퍼와 랜섬웨어의 차이는 목적이 다르다는 점?을 들 수 있다. 이말은 곧, 망가트린(암호화한) 시스템을 복원해주는지 안해주는 지에 따라도 나눠 질 수가 있다. 목적이 돈이냐 감염 PC를 망가트리는지에 따라 달라 지게 된다.
물론 둘의 공통점도 존재한다. 공통점은 MBR 영역에 특정 코드를 쓰고(Overwrite) 해당 영역에서 코드를 실행하여 암호화 하거나, 데이터를 지워버린다는 점이다.
좀 더 분석하다 보면 또 다른 공통점을 가지고 있는데, 이는, 암호화를 위해 Salsa20이라는 암호화 알고리즘을 사용한다는 것이다. Salsa 20에 대해 설명을 하면 니 노트의 양은 너무 커질 거 같고.. 분석 내용을 다루면 또 커질 거 같아서, NotPetya를 보면서 공부 했던 MBR에 대해 정리하려고만 한다. 옛날 같으면 블로그에 올릴탠데, 이제 그런 양식 지키면서 올리는거 너무 귀찮다. 여튼 이제 MBR에 대해서 알아보도록 하자
첨부 파일
-> 다음은 010 Editor에서 제공하는 MBR 탬플릿 파일이다.
MBRTemplate.bt
MBR (Master Boot Record)
MBR은 Master Boot Record의 약자를 가지며, 컴퓨터는 최초 부팅하게 되면 POST(Power On Self Test) 과정이 끝나고 저장 매체의 첫 번째 섹터를 호출하게 되는데, 이 부분이 바로 MBR 영역이 된다. 크기는 512 바이트의 크기를 가지며, MBR 영역의 구조는 다음과 같다.
부트코드 영역(Boot Code)
- 446 바이트의 크기를 가짐
- 부팅 시 최초로 실행되는 코드 영역
파티션 테이블(Partition Table)
- 64 바이트의 크기를 가짐 (4개 각각 16바이트의 엔트리를 가짐 - 곧, 규격 상으론 최대 4개의 운영체제 설치가 가능)
- 부트코드에서 참고하게 되는 파티션 테이블로, 부팅 가능한 파티션을 기록
- 부팅 가능한 파티션이 없을 경우 작성된 에러 메세지를 실행 시키게 된다.
- 파티션 테이블은 총 6개로 나눠짐
시그니처(Signature)
- 2바이트를 가짐
이런 MBR 영역을 읽고 싶으면 HXD, WinHEX, 010 Editor 도구를 사용하면 실제 머신의 MBR을 로드할 수 있다. (관리자 권한 필요)
좀 더 자세한 부분은 아래에서 직접 MBR 코드를 보면서 확인해 보자.
실제 물리 메모리에 올라가 있는 MBR 데이터
다음은 010Editor를 사용해 분석환경의 MBR 데이터를 확인한 데이터다.
MBR의 사이즈를 확인 하면 0x200(512, 446+64+2)인 것을 확인할 수 있다.
- 부트 코드 영역 -
부트 영역은 446 바이트(0x1BE)의 크기의 데이터를 가지고 있는 것을 확인 할 수 있다. 보통 악성코드들은 해당 부트코드 영역에 공격자가 의도하는 어셈코드를 작성하여 악성행위를 시도하게 된다. Petya또한, EXE파일을 통해 해당 영역에 코드를 추가하고, 재부팅 과정 중에 부트 코드가 실행되어 감염 PC에 악성 행위로 하게 된다.
Boot코드 분석에 대한 내용은 다음 노트를 통해 정리하도록 하겠다.
- 파티션 테이블 -
크기는 64바이트(0x40)을 가진다. 곧 각 파티션은 16바이트(0x10)의 크기를 가지게 되며, 해당 데이터를 보면 파티션은 1개만 존재하는 것을 확인할 수 있다. 첫 번째 파티션의 데이터를 확인하면 다음과 같다.
해당 데이터를 아래 테이블에 맞쳐 확인해보도록 하자. 다음은 파티션별 데이터 정보다.
010Editor의 MBR 탬플릿을 사용해 데이터를 확인하면 다음과 같이 확인이 가능하다.
이제 조금더 각 데이터 영역의 값들이 어떤 의미를 하는지 확인해보도록 하겠다.
- 부트 식별자(Boot indicator)
해당 영역은 해당 파티션 영역이 부팅 가능한 파티션인지 아닌지를 확인하는 데이터로 아래와 같은 값을 갖는다.
- 0x80 값을 가질 경우 정상적인 부트 파티션 의미
- 0x00 부팅 파티션이 아닌 것을 의미
우리가 분석하는 데이터의 값을 보면 0x80인 것을 확인할 수 있으며, 이는 부팅 가능한 파티션을 의미하게 된다.
- CHS 영역
*LBA 모드로 주로 사용되기 때문에 실제로 사용되지 않는 영역
해당 영역은 주로 사용되지 않는 영역이라고 설명 했지만, 그런 이유에 대해서 알아볼 좋은 케이스다. 우선 해당 데이터는 CHS 주소 체계를 표현한 값으로, 해당 파티션이 정확하게 디스크의 영역을 알려주는 정보가 된다. 하지만 실제로 해당 데이터 영역을 이용해 역할을 제대로 수행을 할 수 없게 되면서 사용되지 않는다. 이유는 디스크의 용량이 24bit(3Byte)의 CHS 주소체계로 표현 한계가 벗어나기 때문이다.
우선, 아래 데이터를 기반으로 해석 해보자. CHS 주소는 "[실린더 10bit, 헤드 8bit, 섹터 6bit]"로 총 24bit(3Byte)의 값이 기록된다.
Starting CHS Address : 20 21 00h -> 2진수 : 0010 0000 | 0010 0001 | 0000 0000
Partition type : 07h -> 2진수 :
Ending CHS Address : FE FF FFh
Starting CHS Address
0
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
헤드(Head) | 실(C) | 섹터(Sector) | 실린더(Cylinder) |
C(cylinder) : 0x100000000 (10bit) = 2^7 = 256
H(head) : 0x1000000 (8bit) = 2^5 = 32
S(sector) : 0x100001(6bit) = 2^5 + 1 = 33
다음 CHS의 마지막 주소인 FE FF FF의 값을 구하면 다음과 같다.
FE = 11111110
FF = 11111111
FF = 11111111
C : 1111111111 = 1023
H : 11111110 = 254
S : 111111 = 63
이제, CHS를 구하는 방법은 알았으니, 왜 사용되지 않는지에 대해서 설명할 차례 같다. 우선 CHS의 표현할 수 있는 최대치는 다음과 같다.
C : 1111111111 = 1023(0~1023)
H : 11111111 = 256 (0~255)
S : 111111 = 63 (1~63)
곧 2^10 + 2^8 + 2^6-1 = 8,414,461,440Byte = 7.83658GB 이 된다. 곧, CHS주소 영역을 통해 표현할 수 있는 주소는 최대 7.84GB가 되는 것이다.
CHS주소로 LBA 주소를 구하는 방법
LBA = ((실린터 값 * 실린더 당 헤드 개수 + 헤드 값) * 헤드 값) * 트랙당 섹터 개수) + 섹터값 - 1
- LBA 영역
* 시작 위치를 가리키는 주소 값으로, 좀 더 쉽게 설명하면, 해당 파티션 영역은 디스크의 어느 지점에서 파일 시스템이 시작되는지 확인할 수 있다.
* 리틀엔디안으로 표현
데이터는 다음과 같다.
0x08 | 4Byte | 파티션의 첫 섹터의 LBA 주소
0x0C | 4Byte | 파티션의 크기 (단위 섹터)
위에서 확인했던 데이터에서 LBA 영역이 어떻게 되는지 확인 해보자. 다음은 위에 예시에서 사용한 데이터다.
80 20 21 00 07 FE FF FF | 00 08 00 00 | 00 00 00 05
파티션의 첫 섹터의 LBA 주소 : 00 08 00 00
리틀엔디언 변환 -> 00 00 08 00 -> 0x800 -> (10진수)2048
곧, 2048 섹터부터 시작되는 것을 확인할 수 있음, 만약 섹터 하나의 크기가 512Byte인 경우는 다음과 같이 구할 수 있다.
512byte -> CHS 값을 통해 섹터당 크기 확인 가능
2048 * 512 = 1MB
두가지로 해석 가능
- 파티션의 시작섹터가 2048섹터
-파티션의 오프셋은 1MB 지정
실제로 존재하는 NTFS 파일 시스템
파일 시스템이 NTFS인것을 확인 했는데 이 부분은 파티션 테이블에서 File System Type값을 통해 분석 전에 확인이 가능하다. 같은 예시로 확인하면 아래와 같은 데이터에서 0x07이 파일 시스템인 것을 확인할 수 있다.
80 20 21 00 | 07 | FE FF FF 00 08 00 00 00 00 00 05
여기서 0x07은, WinNT에서 NTFS를 의미하며 WinEmbedded에선 exFAT를 의미한다. 해당 값은 아래 위키에서 좀 더 자세히 확인 가능하다.
- 파티션의 크기 (단위 섹터) : 00 00 00 05
* 리틀엔디안으로 표현
* 파티션에 포함된 전체 섹터의 갯수
파티션의 크기를 구해보자. 실습 값은 다음과 같다.
00 00 00 05
리틀엔디안이기 때문에 빅엔디안으로 변환
05 00 00 00
다음 해당 값을 10진수로 변환
83,886,080
해당 값은 섹터의 갯수가 된다. 그럼 총 파티션의 크기를 구하면 다음과 같이 구할 수 있다.
(섹터당 512byte라고 가정하에 )
83,886,080 * 512 = 42,949,672,960 Byte
= 41,943,040 KB
= 40,960 MB
= 40GB
곧, 해당 파티션의 총 크기는 40GB가 된다.
- 시그니처
마지막으로 시그니처는 해당 데이터 구조(Struct)의 MBR 서명?!으로 데이터 구조가 MBR 영역임을 확인하기 위한 데이터로, MBR 영역은 끝에 0x55AA 값을 기록한다.
참고
- 부트코드 참고 자료 : http://forensic-proof.com/archives/439
댓글 없음:
댓글 쓰기