SQLite 데이터베이스는 채팅 메시지부터 거래 로그에 이르기까지 많은 앱에서 발견되는 디지털 증거의 보고입니다. 하지만 기록이 삭제되면 어떻게 될까요? 입력 무료 블록-삭제된 데이터의 잔여물이 남아 있는 데이터베이스 페이지 내 미사용 공간의 숨겨진 섹션. 이러한 프리블록은 포렌식 수사관에게 중요한 기록을 복구하고 숨겨진 증거를 발견할 수 있는 금광과도 같습니다.
이 블로그에서는 SQLite 프리블록의 작동 방식, 헥스 에디터와 같은 도구로 프리블록을 찾는 방법, 삭제된 레코드를 복구하는 방법을 안내합니다. 수사관이든 디지털 포렌식 애호가든 이 가이드를 통해 숨겨진 데이터를 추출하는 필수 기술을 익힐 수 있습니다.
프리블록은 SQLite 데이터베이스 페이지 내에서 사용되지 않는 공간의 섹션입니다. 레코드가 삭제되면 보안 삭제 메커니즘이 활성화되어 있지 않는 한 해당 공간을 즉시 덮어쓰지 않습니다. 대신 해당 공간은 freeblock나중에 쓸 수 있습니다.
이 과정에서
이러한 프리블록에는 원본 데이터의 잔여물이 남아 있는 경우가 많기 때문에 삭제된 기록을 복구하려는 포렌식 수사관에게 중요한 초점이 됩니다.
아래 스크린샷에서는 DB 브라우저를 사용해 SQLite 데이터베이스를 살펴봅니다. '메시지' 테이블에는 두 개의 라이브 레코드가 표시되어 있지만 포렌식 단서에 따르면 삭제된 레코드가 추가로 있음을 알 수 있습니다.
프리블록을 찾고 분석하려면 먼저 SQLite 데이터베이스 페이지의 구조를 이해해야 합니다. 각 페이지에는 프리블록에 대한 포인터를 포함하여 중요한 메타데이터를 제공하는 헤더가 포함되어 있습니다.
아래 표에는 0D 페이지 유형의 헤더 구조가 간략하게 나와 있습니다:
오프셋 | 크기 | 설명 |
---|---|---|
0 | 1 바이트 | 페이지 유형 |
1 | 2 바이트 | 첫 번째 프리블록에 대한 바이트 오프셋 |
3 | 2 바이트 | 페이지의 셀 수 |
5 | 2 바이트 | 셀 콘텐츠의 첫 바이트에 오프셋 |
7 | 1 바이트 | 셀의 조각화된 여유 바이트 수 |
페이지 헤더의 오프셋 1에 있는 값은 첫 번째 프리블록을 가리킵니다. 이 값이 0x0000
페이지에 프리블록이 없습니다.
첫 번째 프리블록을 찾으려면 16진수 편집기에서 데이터베이스를 엽니다. 페이지 헤더의 오프셋 1에 있는 2바이트 값은 프리블록의 위치에 대한 오프셋을 제공합니다.
아래 예시에서는
0x03A9
(소수점 937)을 빨간색으로 표시하여 첫 번째 프리블록의 위치를 가리킵니다.이 오프셋으로 이동하면 프리블록의 시작이 표시됩니다. 아래에서는 오프셋 937에 위치한 셀을 살펴봅니다.
각 프리블록은 4바이트 헤더로 구성됩니다:
0x0000
없는 경우).오프셋 시 0x03A9
를 클릭하면 프리블록 헤더가 표시됩니다:
0x03EA
(소수점 1002).0x0024
(헤더 포함 36바이트).프리블록에는 삭제된 기록의 잔여물이 남아 있는 경우가 많으므로 포렌식 수사관이 데이터의 일부 또는 전체를 복구할 수 있습니다. 아래 스크린샷에서는 삭제된 레코드의 페이로드가 포인터가 제거되었음에도 불구하고 그대로 남아 있어 복구할 수 있습니다.
0x03A9
메시지가 포함되어 있습니다: "별로. 잘 지내세요?"이후 프리블록을 분석하여 삭제된 레코드를 추가로 발견합니다. 오프셋 시 0x03EA
를 클릭하면 프리블록 헤더가 표시됩니다:
0x0016
(22바이트).0x0000
를 다음 프리블록 포인터 필드에 입력합니다.아래 스크린샷은 "안녕 앤디!"라는 삭제된 메시지가 있는 체인의 두 번째 프리블록의 전체 셀 영역을 강조 표시한 것입니다.
그러나 이 페이지에는 프리블록 체인에서 참조하지 않는 삭제된 레코드가 하나 더 있습니다. 페이지 헤더를 다시 살펴보면, 오프셋 3의 2바이트 값에 따라 이 페이지에는 2개의 레코드만 있습니다(0x00002
). 그리고 레코드가 2개뿐이므로 포인터 배열에는 포인터가 2개만 있습니다. 이 두 포인터는 "안녕하세요?"라는 레코드 #2와 "안녕하세요, 스쿠비 스낙스가 있는지 궁금해서요"라는 레코드 #4를 가리킵니다. 페이지 위쪽에 또 다른 긴 메시지가 있다는 것을 알 수 있습니다.
페이지 헤더의 오프셋 5에 있는 2바이트 값은 기본적으로 다음 레코드가 쓰여질 셀 콘텐츠 영역, 즉 프리블록 중 하나에 맞지 않는 경우의 오프셋입니다. 이 값은 0x0363
소수점 오프셋 867입니다.
위 스크린샷의 화살표는 페이지 오프셋 867을 가리키고 있습니다. 이것은 셀 콘텐츠의 시작 부분으로, 이 레코드 바로 위에 다음 레코드가 추가된다는 의미입니다. 그 위에 삭제된 레코드에는 '어젯밤에 새 공급이 들어왔습니다'라는 메시지가 포함되어 있습니다. 운이 좋으세요. 얼마나 필요하신가요?"
데이터베이스는 이 데이터를 할당되지 않은 공간으로 간주합니다. 이 공간은 다음과 같이 채워질 수 있습니다. 0x00
를 가리키는 포인터 배열에 포인터가 없기 때문입니다.
페이지의 두 프리블록에 맞지 않을 정도로 큰 레코드가 이 페이지가 속한 테이블에 추가되면 #5 레코드인 메시지를 덮어쓰게 됩니다.
덮어쓰기를 기다리는 세 번째 삭제된 레코드와 함께 두 개의 프리블록을 식별했으니 이제 어떻게 보이는지 살펴봅시다:
원시 형식으로 데이터베이스를 분석한 결과, 데이터베이스 뷰어에 표시된 '라이브' 레코드 2개 이상의 레코드가 포함되어 있다는 결론을 내릴 수 있었습니다.
#1 레코드는 "안녕 앤디!"라는 메시지일 가능성이 높고, #3 레코드는 "별일 없으세요?"라는 메시지일 가능성이 높습니다. 잘 지내세요?"라는 메시지일 가능성이 높습니다. 레코드 #5는 셀 안에 있는 레코드 번호가 "어젯밤에 새 물품을 받았어요"라는 메시지로 확인되었습니다. 운이 좋으시네요. 얼마나 필요하세요?"
프리블록은 포렌식 조사에서 강력한 도구로, 삭제된 기록과 할당되지 않은 데이터를 살펴볼 수 있는 창을 제공합니다. 이러한 기술을 숙달함으로써 수사관은 데이터베이스가 남긴 디지털 흔적을 찾아낼 수 있습니다.
SQLite 포렌식 기술을 한 단계 더 발전시킬 준비가 되셨나요? 고급 교육 프로그램을 살펴보고 포렌식 전문가가 될 수 있는 방법을 알아보려면 문의하세요.
스웨덴에서 방문하신 것을 확인했습니다. 쇼핑 편의를 위해 가격을 스웨덴 크로나로 업데이트했습니다. 대신 미국 달러를 사용하세요. 해지