CreateMutex
까보면 다나와~
유용한 지식 자료들/하드웨어, MBR 등 (2)

하드디스크, MBR 구조 등 정리.

간만에 좋은 분석 거리를 남긴 320 악성코드. 남들다하는 분석이라고 대충봤는데, 분석하다보니 하드디스크, MBR, VBR 용어에서 부터 구조까지 디테일한 내용 정리가 필요함을 느꼈다.

 

추가 #1. 먼저 MBR의 섹터 주소는 0, 섹터는 1번이다. 물리적으로 Cyl 0, Side 0, Sector 1인 것이다. 따라서 부를때 약간의 모호함이 있는데, 내용은 다음 링크를 참고하자. 대부분 주소를 따라 0번 섹터가 MBR이라고 하는 것 같다.

http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q97819

 

추가 #2. 실린더, 헤더, 섹터는 -> "conversion of physical disk geometry"적인 용어로 "the number of cylinders on the disk, number of heads per cylinder, and number of sectors per track" 이런식으로 불린다.

 

MBR은 파티션을 만들면 쓰여지게 되며, 부트섹터(Boot Sector)는 포멧할때 쓰여진다.(아마 포멧할때 NTFS, FAT과 같은 파일시스템을 정의할 것이다.)

 

MBR은 Bios에 의해 메모리(0000:7c00)에 로드된다. MBR코드는 파티션 테이블을 참고하여 ACTIVE 파티션을 찾아서 해당 파티션의 부트섹터를 로드한다.

 

다음은 MBR 섹터이다.

 

 

MBR은 446byte의 Boot code + 각 16byte 4개의 Partiton table entry(상기 그림의 파란 박스), 총 64byte로 이루어진 Partition Table + 2byte Magic Number로 구성된다. 총 512 bytes, 정확히 1개 섹터 크기이다.

 

상기 그림의 빨간 박스, 정확히 0x1B8 Offset은 Disk signature이다. (4byte 고정인건지 00 값은 끊는 건지 모르겠다.)

 

추가 #3.윈도우에서는 해당 시그니처를 레지스트리 키를 통해 확인 할 수 있다. 다음은 XP에 대한 레지스트리 키이다. 레지스트리를 확인하면 상기 그림의 Disk signature와 같은 unique한 값과 동시에 "00 7e"(63 sector)라는 값을 볼 수 있는데 이는 C 드라이브 시작지점에 대한 디스크 오프셋 값이다.

"HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices" 

 

 

이제부터는 Partition Table에 대한 설명이다. (사실 이것 때문에 글을 작성 중이다.)

Partition Table은 4개의 entry가 존재한다. 각 entry는 Partition에 대한 정보가 Structure로 되어 있다.

 

상기 MBR 그림의 파란 박스가 첫번째 Partition entry로 Offset 0x1BE로 고정이다.

 

다음은 Partition Table Fileds이다.

 

 

http://blogs.msdn.com/b/ntdebugging/archive/2007/06/19/how-windows-starts-up-part-1-of-4.aspx

 

위의 그림이 설명이 잘 나와 있다. 그중에 눈여겨 볼 것은 바로 Relative Sectors!

그림에 "3F 00 00 00" 4byte 크기로 3F번째 섹터가 디스크의 시작 지점이라는 것을 보여주고 있다.

 

어셈으로

shl "3F", 9 -> 7E00 -> 32256(512*63)

 

이번 320 악성코드는 Relative Sectors 필드를 참고해서 Active된 파티션의 물리주소를 찾아냈다. 즉, Boot partition의 디스크 Offset으로 접근해서 데이터를 먼저 날린것이다.(물론 MBR을 먼저 지우면 VBR을 지울수 없다;;)

 

여기서 Boot Sector가 Volume Boot Recode(VBR)이다.

 

'유용한 지식 자료들 > 하드웨어, MBR 등' 카테고리의 다른 글

_DOS_PARTITION_STRUCT  (0) 2013.03.11
  Comments,     Trackbacks

_DOS_PARTITION_STRUCT

IDA로!!!!!


typedef struct _DOS_PARTITION_STRUCT {
unsigned char IsBootable; // 부트 가능하면 0x80, 부트 불가능하면 0x00
unsigned char CHSOffset[3]; // CHS(Cylinder-Head-Sector)로 표현되는 실제 파티션 주소
unsigned char PartitionType; // 파티션 유형 (ex: FAT32=0x0C, NTFS=0x07, ...)
unsigned char EndCHSOffset[3]; // CHS 주소로 표현되는 파티션의 끝 지점
unsigned long LBAOffset; // LBA(Logical Block Addressing)로 표현되는 파티션 주소
unsigned long SizeInSector; // 파티션이 사용하는 섹터(LBA)의 총 개수
} DOS_PARTITION_STRUCT, *PDOS_PARTITION_STRUCT;


http://vbdream.tistory.com/95


  Comments,     Trackbacks