suhotang
suhotang 개발 블로그
suhotang
전체 방문자
오늘
어제
  • 분류 전체보기 (9)
    • 이슈 로그 (5)
    • 프로젝트 (2)
    • React (0)
    • 과제 (2)

인기 글

태그

  • 프로젝트
  • 중복 호출 방지
  • z-index
  • 구글맵
  • 이슈 로그
  • react
  • 포렌식
  • 회고록
  • 이슈 해결
  • 패키지 버전
  • 프로세스
  • c programming
  • 시스템 프로그래밍
  • 렌더링
  • CSS
  • 캐싱
  • 지도최적화
  • 쓰레드
  • 어쩌다보니 비건
  • 이슈로그
  • 디스크 분석
  • 커널 오브젝트

최근 글

hELLO · Designed By 정상우.
suhotang
과제

[forensic] 디스크 이미지 분석 프로그램 (1)

[forensic] 디스크 이미지 분석 프로그램 (1)
과제

[forensic] 디스크 이미지 분석 프로그램 (1)

2019. 3. 14. 11:19

포렌식 시간에 C언어로 vhd 파일(디스크 이미지 파일)을 읽어서 섹터 단위(512Byte)로 출력하는 프로그램을 구현하였다.

 

먼저, MBR(Master Boot Record)에 대해 정리해보자.

 

MBR은 저장매체의 첫 번째 섹터 (LBA 0)에 위치하는 512 바이트 크기의 영역이다.

처음 446 바이트는 부트 코드 (boot code) 영역, 64 바이트는 파티션 테이블 (partition table) 영역, 마지막 2 바이트는 시그니처 (signature)를 나타낸다.

아래는 프로그램을 C언어로 구현한 코드이다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    FILE* fp = NULL;
    int menuNumber = 0;
    char filePath[100];
    int fileSize = 0;
    int sectorCount = 0;
    
    // Using for print sector info
    int i, j, ch = 0;
    int columnNum = 0;
    int offset = 0;
    int curSec = 0;
    char data[20] = {};
    data[19] = '\0';
    
    printf("  파일 경로 입력 : ");
    scanf("%s", &filePath);

    if ((fp = fopen(filePath, "rb")) == NULL) {
      	printf("File Open Error!");
    } else {
        printf("\n");
        printf("  파일 오픈 성공!\n\n");
        fseek(fp, 0, SEEK_END);    // 파일 포인터를 파일의 끝으로 이동시킴
        fileSize = ftell(fp);
        sectorCount = (fileSize / 512);

        fseek(fp, 0, SEEK_SET);
    }
	
    printf("  출력할 섹터 위치를 입력해주세요(0 ~ %d) : ", sectorCount);
    scanf("%d", &curSec);
    
    for (int k = 0; k < curSec; k++) {
    	offset += 512;
    }
    
    // 선택한 섹터로 이동
    fseek(fp, offset, SEEK_SET);
    
    printf("offset(h)  ");
    // 열 번호 출력 (16진수로 0 - 16까지)
    for (columnNum = 0; columnNum < 16; columnNum++) {
    	printf("%02X ", columnNum);
    }
    printf("\n\n");
    
    for (i = 0; i < 32; i++) {
    	// 행 주소 출력 (시작 offset)
        printf("%08X  ", offset);
        offset += 16;
        for (j = 0; j < 16; j++) {
        	if ((ch = fgetc(fp)) != 'EOF') {
            	printf(" %02X", ch);
                if (int(ch) <= 15 || int(ch) >= 127) {
                    data[j] = '.';
                } else {
                	data[j] = char(ch);
                }
            }
        }
        // 16진수 코드를 char로 바꾼 데이터 출력
    	printf("  %s\n", data);
    }
    printf("\n\n");
}

 

1바이트 씩 읽어서 한 줄에 16바이트씩 32줄로 출력했다. 아래는 출력화면을 캡처한 사진이다.

 

먼저, vhd 이미지 파일이 위치한 경로를 입력한 후, 파일이 정상적으로 open 되었다면 출력할 섹터 위치를 입력한다.

(섹터 구간은 0부터 섹터 개수-1까지)

 

섹터 위치를 입력하면 다음과 같이 Hex값이 출력된다.

'과제' 카테고리의 다른 글

[forensic] 디스크 이미지 분석 프로그램 (2)  (0) 2019.03.22
    '과제' 카테고리의 다른 글
    • [forensic] 디스크 이미지 분석 프로그램 (2)
    suhotang
    suhotang
    개인 공부정리용 블로그

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.