$Recycle.bin

1. 개요

디지털 포렌식에서 휴지통은 삭제된 파일과 사용자의 행동을 추적하는 데 중요한 역할을 한다. 윈도우 환경에서 휴지통은 파일 삭제 시 일시적으로 파일을 저장하는 공간으로, 이곳에서 발견되는 정보는 중요한 디지털 증거가 될 수 있다. 본문에서는 윈도우 휴지통의 구조, 파일 형식, 레지스트리 설정, 그리고 버전별 차이점에 대해 상세히 설명하고자 한다.

파일 삭제 과정

윈도우에서는 delete를 통한 일반 삭제와 shift + delete를 통한 완전 삭제가 있다. 두 삭제 방법은 휴지통을 비우기를 실시한다면 결론적으로 같은 방법인데, 그 과정의 차이에 대해 설명하고자 한다.

1) 일반 삭제 - Delete → 휴지통 비우기

  1. 사용자는 파일을 선택하고 Delete 키를 누르거나 우클릭하여 ‘삭제’를 선택한다.

  2. 파일은 실제로 삭제되지 않고 운영체제 별 휴지통 폴더로 이동하는데, 이 폴더는 윈도우 NT버전 이후를 기준으로 각 드라이브의 루트에 존재한다. 휴지통으로 이동된 파일은 논리적으로는 원래 위치에서 제거되지만, 물리적으로는 드라이브에 남아있다.

  3. 파일 시스템은 해당 파일의 메타데이터를 업데이트해 파일의 경로가 휴지통 경로로 변경되었음을 표시한다.

  4. 사용자는 휴지통을 우클릭하여 ‘휴지통 비우기’를 선택한다.

  5. 파일의 할당 테이블이 해제되고 삭제된 데이터임을 나타내도록 flag가 변경된다.

  6. 파일이 차지하던 블록이 빈 공간으로 표시되어 덮어쓰일 수 있는 상태가 된다.

2) 완전 삭제 - Shift+ Delete

  1. 사용자는 파일 선택 후 Shift + Delete를 눌러 완전 삭제한다.

  2. 파일의 할당 테이블이 해제되고 삭제된 데이터임을 나타내도록 flag가 변경된다.

  3. 파일이 차지하던 블록이 빈 공간으로 표시되어 덮어쓰일 수 있는 상태가 된다.

3) 파일의 복구에 대해서

파일을 정상적으로 복구하기 위한 필수조건은 **‘데이터 영역이 덮어써지지 않는 것’**이다.

파일의 복원 방법은 메타데이터를 사용한 복구와 파일 카빙을 통한 복구 방법이 있는데, 두 방법 모두 데이터 영역에 쓰인 파일 원본을 찾는 방식에 차이만 있을 뿐, 해당 데이터 영역에 존재하는 파일을 가져온다는 점에서는 동일하다.

4) flag에 대해서

윈도우에서 파일은 MFT(Master File Table)라고 하는 데이터 테이블을 통해서 디스크에 있는 모든 파일과 디렉토리에 대한 정보를 저장한다.

MFT는 파일, 폴더에 대한 정보를 저장하기 위해 엔트리(Entry)라고 하는 레코드를 사용한다.

이 레코드에는 파일 이름, 파일 크기, 파일 경로 등의 메타데이터를 저장하는데, 이 메타데이터 중 해당 파일이 삭제되었는지를 나타내는 flag라는 속성이 있다.

이 플래그를 통해 운영체제는 해당 MFT 엔트리가 사용 중에 있는지, 아닌 지를 판단해 해당 공간의 사용 여부를 판단하게 된다.

플래그 값에 따른 할당 상태는 다음과 같다.

바이트
설명

0x00

사용 중이 아님

0x01

사용 중인 파일

0x02

디렉토리

0x03

사용 중인 디렉토리

윈도우 버전 별 휴지통 구조

윈도우 95/98/Me

  • 폴더 위치: 삭제 드라이브:\\RECYCLED

  • 구조: 시스템에 의해 생성된 단일 폴더로, 모든 사용자가 공유

  • INFO2 파일: 삭제된 파일의 정보를 저장하는 메타데이터 파일

윈도우 NT/2000/XP

  • 폴더 위치: 삭제 드라이브:\\RECYCLER

  • 구조: 사용자 프로필마다 고유의 휴지통 폴더가 생성된다. 각 폴더는 사용자의 SID(Security Identifier)로 식별

  • INFO2 파일: 윈도우 95/98/Me와 마찬가지로 삭제된 파일의 메타데이터를 저장

윈도우 Vista 및 이후 버전

  • 폴더 위치: 삭제 드라이브:\\$Recycle.Bin

  • 구조: 윈도우 NT ~ XP와 동일하게 각 사용자의 SID를 기반으로 폴더가 생성되며, 시스템 및 숨김 속성이 적용된다.

  • $I 파일과 $R 파일:

    • $I 파일: 삭제된 파일의 메타데이터 정보를 담은 파일

    • $R 파일: 실제 삭제된 파일의 내용을 담고 있는 파일

$Recycle.Bin 폴더

현재 지원되는 최신 운영체제인 윈도우 10/11 환경에서 파일을 삭제하면 해당 파일이 속한 드라이브의 $Recycle.Bin 폴더에 저장된다.

$Recycle.Bin 폴더는 시스템 및 숨김 속성이 적용되어 있으며, 고유의 CLASS ID 속성을 지니고 있다.

▶ CLASS ID란?

Class ID는 각 폴더마다 들어있는 desktop.ini 파일에 작성되어있는데, 윈도우에서 특정 폴더의 여러가지 속성을 정의하는 데에 사용된다. 예를 들어 휴지통 또한 고유의 Class ID 값을 지니고 있으며 폴더의 속성 창, 컨텍스트 메뉴, UI 요소가 일반적인 폴더와 다르다.

이와 같이 Class ID 변경을 통해 일반 폴더와 다른 특정 폴더의 UI, 속성 등을 지정할 수 있다. 내 컴퓨터, 제어판, 네트워크 환경 등의 폴더 등 또한 고유의 Class ID를 가지고 있다.

하지만 별도 설정을 하지 않았다면 휴지통 폴더가 보이지 않을 뿐더러 사용자 별 휴지통 폴더에 접근할 수 없다.

이러한 시스템 파일을 확인하기 위해선 폴더 옵션 → 보기 → 보호된 운영 체제 파일 숨기기를 체크 해제하면 된다.

또한 원활한 액세스를 위해선 “FTK Imager”와 같은 분석 도구를 활용해야 한다. 주요 시스템 폴더이기에 무결성 및 보호를 위하여 접근하기 위해서 SYSTEM 권한을 요구하기 때문이다.

휴지통 폴더를 열어보면 내부는 사용자의 SID + RID로 이루어진 폴더로 이루어져 있다. 다시 말해, 드라이브 별로 각 사용자의 고유 휴지통 폴더가 존재한다.

사용자의 SID는 나열된 숫자 그룹 맨 마지막인 RID를 제외한 전부인데, 사진의 경우 1000과 1001이 RID가 되고 나머지 전체가 SID가 된다. RID는 하나의 호스트 내부에 여러 계정이 존재할 경우 이를 구분 짓기 위한 역할을 한다.

이 때, 호스트의 SID는 cmd에서 whoami 명령어로 확인할 수 있으며, 도메인 환경의 경우 DC의 SID가 출력되므로 별도의 명령어를 사용해야 한다.

whoami /user
wmic UserAccount Where LocalAccount=True Get SID

또는 레지스트리 편집기에서 다음 경로에 있는 값을 통해 확인할 수도 있다.

  • HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\WindowsNT\\CurrentVersion\\ProfileList

  • HKEY_LOCAL_MACHINE\\SAM\\SAM\\Domains

계정의 SID는 Domains - Account 키의 V 엔트리를 통해 확인 할 수 있다.

GID의 경우 Account - Users - Names 키 하위 각 사용자의 이름 별로 생성된 키로 확인한다.


2. 구조

폴더를 열어보면 삭제한 파일의 원본 이름이 아닌 각각 $I~, $R~ 형식으로 이루어진 것을 확인할 수 있는데, 각 파일의 정보는 다음과 같다.

$I 파일

메타데이터 파일로, 삭제된 파일의 중요한 정보를 담고 있다. 고정 544바이트 크기를 가진다.

윈도우 10 이전

  • Offset 0x0000~0x0007 (8 bytes): $I 파일의 헤더

  • Offset 0x0008~0x000F (8 bytes): 삭제된 파일의 원래 크기

  • Offset 0x0010~0x0017 (8 bytes): 파일이 휴지통으로 이동된 시간(Unix 타임스탬프)

  • Offset 0x0018~: 파일의 이름

윈도우 10 이후

  • Offset 0x0000~0x0007 (8 bytes): $I 파일의 헤더

  • Offset 0x0008~0x000F (8 bytes): 삭제된 파일의 원래 크기

  • Offset 0x0010~0x0017 (8 bytes): 파일이 휴지통으로 이동된 시간(Unix 타임스탬프)

  • Offset 0x0018~0x001B (4 bytes): 파일 이름의 길이

  • Offset 0x001C~: 파일의 이름

$R 파일

실제 삭제된 파일의 내용을 담고 있는 파일로서, 원본 파일의 확장자를 그대로 유지한다. $R 파일의 이름은 6자리의 무작위 문자로 구성되는데, 예를 들어 원래 이름이 "document.txt"인 파일을 삭제하면 "$RABCDEF.txt"라는 이름으로 저장된다.

$I 파일은 $R 파일의 이름을 그대로 따라가며, 위 예시의 경우 $I 파일의 이름은 $IABCDEF가 된다.

INFO2 파일과 D~ 파일

앞서 설명하듯 $I 파일은 윈도우 Vista 버전부터 사용되는 방식으로서, XP 이전 버전에서는 INFO2 파일과 D 파일을 사용한다. 침해사고 분석을 하다보면 종종 윈도우 서버 2003과 같은 운영체제가 사용되는 경우를 종종 발견할 수 있는데, 이와 같은 레거시 시스템에서 INFO2 파일 구조를 사용하기에 알아둘 필요가 있다.

INFO2 파일

휴지통 내부 파일들의 메타데이터를 담고 있다. $I와 다르게 단일 파일로 구성되며, 16바이트의 헤더 이후의 반복적인 구조로 이루어져 있다.

INFO2 파일 시작 기준

  • Offset 0~15 (16 bytes): INFO2 파일의 헤더이다. 헤더의 시작으로부터 13-14번째 바이트는 각 INFO2 레코드의 크기를 나타낸다. 예시의 경우 2003h → 320h → 800d로 800 바이트가 된다.

Record 시작 기준

  • Offset 265~268 (4 bytes): Record 번호를 나타내며 1부터 순차적으로 증가한다.

  • Offset 269~272 (4 bytes): 드라이브 정보를 나타낸다. 02=C, 03=D …

  • Offset 273~280 (4 bytes): 파일 삭제 시간 (Windows Filetime)

  • Offset 281~284 (4 bytes): 삭제된 파일의 원래 크기

D 파일

실제 삭제된 파일이며 일정한 규칙에 의해 이름이 정해진다.

(D + 원본 파일 드라이브 위치 + 인덱스 번호).(원본 파일 확장자) 형식이며,

운영체제 설치 후 C드라이브에서 처음 삭제된 txt 파일이라면 “Dc1.txt” 가 된다.


3. 분석 방안

휴지통의 설정은 사용자 별로 다르게 적용될 수 있으며, 관련 레지스트리는 HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\BitBucket에 저장된다.

여기서 NukeOnDelete 값이 0이면 파일이 휴지통을 거쳐서 삭제되고, 1이면 바로 삭제되며, 이 방법을 통해 휴지통을 경유하지 않고 삭제 가능하다.


4. 분석용 도구

INFO2, $I 파일을 일일히 열어가며 확인하는 것은 많은 시간을 할애하는 작업이다.

이에 지금과 같은 작업을 편하게 분석하기 위한 도구 또한 존재하는데, 두 가지를 소개하고자 한다.

RBCmd

오픈소스 포렌식 도구를 알아보았다면 한번 씩 들어봤을 “Eric Zimmerman”이 만든 분석 도구다. $I, INFO2 파일 모두 지원하며 개별 파일은 물론 recusive한 폴더 단위 분석도 지원한다.

▶ 명령어

명령어
설명

-d

재귀적으로 처리할 폴더를 선택한다. 이것 또는 -f 중 하나는 필수로 입력해야 한다.

-f

처리할 파일. 이것 또는 -d 중 하나는 필수로 입력해야 한다.

-a

전체 출력을 표시하지 않고 처리 중인 파일 이름만 표시한다.

-csv

CSV 형식의 결과를 저장할 디렉토리를 지정한다. 전체 경로를 큰따옴표로 포함해야 한다.

-csvf

CSV 형식의 결과를 저장할 파일 이름을 지정한다.

-dt

타임 스탬프를 표시할 때 사용할 사용자 정의 날짜/시간 형식을 지정한다.

-debug

처리 중 디버그 정보를 표시한다.

-trace

처리 중 추적 정보를 표시한다.

▶ 결과 필드

  • Version: 대상 파일의 운영체제

  • SourceName: 소스 파일 이름

  • FileType: 소스 파일 종류 ($I, $D … )

  • FileName: 대상 파일 이름

  • FileSize: 대상 파일 크기

  • DeletedOn: ****대상 파일 삭제 시각

Rifiuti2

최신 운영체제는 지원하지 않지만 XP 운영체제까지의 INFO2와 Vista의 $I 파일 분석이 가능한 도구이다.

▶ 명령어

명령어
설명

-h, --help

도움말 옵션을 표시한다.

--help-all

모든 도움말 옵션을 표시한다.

--help-format

출력 형식 옵션을 표시한다.

-o, --output=FILE

외부 파일에 결과를 작성한다. (추출 가능)

-z, --localtime

삭제 시간을 로컬 시스템의 시간대로 표시한다. (기본값은 UTC)

-v, --version

버전 정보를 출력한다.

-l, --legacy-filename=CODEPAGE

사용 가능한 레거시 경로를 표시하고 해당 코드 페이지를 지정한다.

t, --delimiter=STRING

TSV의 필드 구분자를 지정한다. [지정하지 않으면 '\t' (탭) 사용]

-n, --no-heading

TSV 열 머리글과 메타데이터를 표시하지 않는다.

-f, --format=FORMAT

xml, json 등의 출력 포맷을 지정한다. (기본값은 text)

▶필드

  • Index

    • ~XP: 숫자를 사용한 항목의 시간 순서

    • Vista: 휴지통 폴더 내 $I 파일 이름

  • Deleted Time: 대상 파일 삭제 시각 (UTC+0)

  • Gone?: 대상 파일의 영구적인 삭제 또는 복원 여부

  • Size: 대상 파일의 크기

  • Path: 삭제 당시 대상 파일의 경로

Last updated

Was this helpful?