yon11b

[SK 쉴더스 루키즈] OLE 구조 분석 본문

보안/SK 쉴더스 루키즈

[SK 쉴더스 루키즈] OLE 구조 분석

yon11b 2026. 6. 15. 13:11
반응형

OLE: ms office 파일 포맷

마이크로소프트가 만든 문서 안에 다른 파일을 넣거나 연결하는 기술

분석 도구

SSViewer, oletools, oledump.py

기능

  • word 문서에 excel 차트를 넣음
  • 차트를 더블 클릭하면 excel이 열림
  • 원본 excel 파일과 연결하거나 문서 내부에 저장할 수 있음

OLE 파일은 내부가 일반 파일이 아니라 작은 파일 시스템(폴더+파일 구조) 처럼 생겼다.

Document.doc
 ├─ WordDocument
 ├─ VBA
 │   ├─ Module1
 │   └─ Module2
 ├─ SummaryInformation
 └─ ObjectPool

 

  1. 헤더 블록 (512byte)
    1. 매직 시그니처→ D0C 로 기억하자!
    2. D0 CF 11 E0 A1 B1 1A E1
  2. 데이터 블록(512byte~)
    1. FAT
    2. Directory
    3. Stream
  3. txt, image 등이 여기 저장됨
OLE File
├─ Header
├─ Property (Directory)
├─ BAT(FAT)
├─ SBAT(Mini FAT)
├─ Stream
└─ Storage

OLE는 악성코드를 숨기거나 실행시키는 컨테이너로 자주 사용된다.

 

공격방식

  1. 악성 매크로 저장
    Word 문서 내부 OLE 구조에 VBA 매크로를 넣는다.
    invoice.doc
     └─ VBA
         └─ AutoOpen()
    
    사용자가 문서를 열면 autoOpen() → powershell 실행 → 악성코드 다운로드 → 실행
  2. OLE Object 에 EXE 삽입

header는 idx: -1부터 시작한다.

(idx+1) * 512 byte 부터 시작한다.

header: 0 / property: 512

 

Property

파일/폴더 목록(디렉터리)

 

BBAT

큰 블록(보통 512B 또는 4096B)의 연결 정보

파일이 여러 블록에 흩어져 있을 때 다음 블록 위치를 알려줌

 

SBAT

작은 데이터(< 4096B)용 연결 테이블

작은 Stream을 저장할 때 사용

 

Stream

실제 데이터

문서 내용, VBA 매크로, 이미지, 임베디드 객체 등이 들어있음

 

 

OLE 헤더 구조

매직넘버: D0 CF → OLE 구조구나!

매직ID: D0 CF 11 E0 A1 B1 1A E1

 

Start block of Property: 00 00 00 2E (little endian)

파일 이름 목록 저장되어 있는 곳

property 시작 주소 구하기: (0x2E+1) * 512(=0x200) = 5E00

5E00 자리가 property 데이터들이 저장되어 있는 자리이다.

 

분석

 

file? dir?

  • 01
    • storage
  • 02
    • stream file
  • 05
    • root dir

프로퍼티 연결: linked list 같이 연결되어있다.

하위 프로퍼티: 03의 의미

3번으로 가보면 WordDocument 라고 써져 있는 것을 확인할 수 있다.

 

WordDocument 부분 분석

이전 프로퍼티: 02

다음 프로퍼티: 05

4번을 건너뛰고 5번이 다음 프로퍼티이다.

하위 프로퍼티는 없다.

 

idx 0에 가서 0x1000바이트가 wordDocument 데이터라는 것을 알 수 있다.

그런데 아까 말했듯이 idx가 -1부터 시작하기 때문에 주소를 구할 때는 (idx+1)*0x200==512로 가야 한다.

 

ssviewer로 확인한 word파일의 시작 hex는 ECA5이다.

ssview로 word 파일 열어서 분석이 가능하다.

 

 

0x200번지로 가서 확인한 데이터의 시작 주소도 같다는 것을 확인할 수 있다.

 

data size: 0x1000 == 4096 byte도 확인할 수 있다.

property를 보면, 어떤 데이터가 어떤 위치에 어떤 속성값으로 저장되어있는지를 볼 수 있다.

728x90