RTF 파일 분석하기

최근에 확장자는 DOC 였지만 RTF(Rich Text Format) 포맷의 문서에 포함된 악성코드가 확인이 되어 문서내에서 EXE 파일을 뽑아내는 방법에 대해 연구한 내용을 기록 합니다.

우선 대상 샘플은 주말에 근무하다 발견한 doc 확장자를 가진 RTF 파일 입니다. 파일을 실행하면 아래와 같이 나오게 됩니다.

PDF 파일 아이콘이 있으며 더블클릭을 하면 가운데 내용처럼 경고창이 나타나게 됩니다. [확인] 버튼을 누르면 당연히 문서내에 포함된 EXE 파일이 실행이 됩니다.

그럼 이제부터 해당 문서내에 있는 EXE 파일을 추출하는 작업을 진행해 보도록 하겠습니다. 우선 에디터로 해당 문서를 열어 보면 아래와 같은 형태로 되어 있습니다.

C:\Users\ByJJoon\Downloads\RTF>cat sample.doc
{\rtf1\ansi\ansicpg1252\deff0{\fonttbl{\f0\fswiss\fcharset0 Arial;}}
{\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\lang1033\f0\fs20{\object\objemb{\*\objclass Package}\objw1950\o
bjh765{\*\objdata
01050000
02000000
08000000
5061636b61676500
00000000
00000000
99b20000
0200636f7572745f646f63756d656e74732e70646600433a5c446f63756d656e747320616e6420
53657474696e67735c41646d696e6973747261746f725c4465736b746f705c332e69636f000000
03002f0000005c5c3139322e3136382e38382e315c4c696e75782053686172655c657865735c64
656d323030315f31302e6578650010b200004d5a90000300000004000000ffff0000b800000000
000000400000000000000000000000000000000000000000000000000000000000000000000000
c00000000e1fba0e00b409cd21b8014ccd21546869732070726f6772616d2063616e6e6f742062
.
.
[생략]
.
.
756d656e74732e70646600210041001c000000fb021000070000000000bc020000000001020222
53797374656d0000301a666d00000a0026008a0100000000ffffffff84f30700040000002d0101
00030000000000
}{\result{\pict\wmetafile8\picw1950\pich765\picwgoal1950\pichgoal765
010009000003400700000200210600000000050000000b0200000000050000000c02320081001c
000000fb02f5ff000000000000900100000001000000005461686f6d610000b4130a84f8f20700
.
.
[생략]
.
.
000000000000000000000000000000000000000000000000000000000000000000000000000000
000005000000020101000000050000002e01060000001000000021051300636f7572745f646f63
756d656e74732e70646600210041001c000000fb021000070000000000bc020000000001020222
53797374656d0000301a666d00000a0026008a0100000000ffffffff84f30700040000002d0101
00030000000000
}}}\par
(double click to view)\par
}

C:\Users\ByJJoon\Downloads\RTF>

objdata 를 시작해서 }{\result 사이의 내용만 따로 뽑아내어 bin.dump 파일로 저장하도록 합니다. 뽑아낸 내용은 모두 바이너리 값으로 Hex 값으로 변경하여야 합니다. 해당 작업을 아래와 같이 스크립트를 작성하여 할 수 있습니다.

#!/usr/bin/python
import sys, binascii, re

if len(sys.argv) != 2:
    print 'Usage : ' + sys.argv[0] + ' Filename'
    sys.exit(1)

file = open(sys.argv[1], 'r')
input = file.readlines()

tmp = ''
for x in input:
    x = re.sub('\s', '', x)
    tmp += binascii.unhexlify(x)

output = open('final.bin', 'wb')
output.write(tmp)

위 코드를 이용하여 아래와 같이 변경할 수 있습니다.

C:\Users\ByJJoon\Downloads\RTF>RTF.py bin.dump

C:\Users\ByJJoon\Downloads\RTF>xxd final.bin
0000000: 0105 0000 0200 0000 0800 0000 5061 636b  ............Pack
0000010: 6167 6500 0000 0000 0000 0000 99b2 0000  age.............
0000020: 0200 636f 7572 745f 646f 6375 6d65 6e74  ..court_document
0000030: 732e 7064 6600 433a 5c44 6f63 756d 656e  s.pdf.C:\Documen
0000040: 7473 2061 6e64 2053 6574 7469 6e67 735c  ts and Settings\
0000050: 4164 6d69 6e69 7374 7261 746f 725c 4465  Administrator\De
0000060: 736b 746f 705c 332e 6963 6f00 0000 0300  sktop\3.ico.....
0000070: 2f00 0000 5c5c 3139 322e 3136 382e 3838  /...\\192.168.88
0000080: 2e31 5c4c 696e 7578 2053 6861 7265 5c65  .1\Linux Share\e
0000090: 7865 735c 6465 6d32 3030 315f 3130 2e65  xes\dem2001_10.e
00000a0: 7865 0010 b200 004d 5a90 0003 0000 0004  xe.....MZ.......
00000b0: 0000 00ff ff00 00b8 0000 0000 0000 0040  ...............@
00000c0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000d0: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000e0: 0000 00c0 0000 000e 1fba 0e00 b409 cd21  ...............!
00000f0: b801 4ccd 2154 6869 7320 7072 6f67 7261  ..L.!This progra
0000100: 6d20 6361 6e6e 6f74 2062 6520 7275 6e20  m cannot be run
0000110: 696e 2044 4f53 206d 6f64 652e 0d0d 0a24  in DOS mode....$
.
.
[생략]

이제 PE 파일 형태를 갖춘거 같습니다. 이제 완벽한 PE 파일로 만들기 위해 시작 지점과 마지막 지점을 알아보도록 하겠습니다.

우선 시작지점은 당연히 PE 파일임을 뜻하는 MZ가 되겠죠?
이제 마지막 데이터가 어디인지를 알아내야 합니다. 마지막 데이터의 위치는 위에 노란 블록으로 표시한 값을 확인하면 됩니다.

바로 0xb200 가 문서내에 포함된 EXE 파일의 전체 크기를 나타냅니다. 따라서 헥스 에디터에서 MZ 앞부분을 지운 다음에 0xb200까지만 남기고 아래 데이터는 다 지우면 되는겁니다.

이제 완성한 파일을 확인해 보도록 하겠습니다.

C:\Users\ByJJoon\Downloads\RTF>file final.bin
final.bin: PE32 executable for MS Windows (GUI) Intel 80386 32-bit

C:\Users\ByJJoon\Downloads\RTF>md5sum final.bin
f96aa9da4f47cff01019a143bc8eedf4 *final.bin

PE 파일로 확인되었습니다. 해쉬값을 이용해여 VirusTotal 사이트에서 확인해 보도록 하겠습니다.
http://www.virustotal.com/analisis/801c690f7a4fc7b0ed215fc65ed9aa615841392cf7c34cdfb3641648ec349b28-1273347082

하지만 위의 방법은 그냥 노가다이며 RTF 내에 있는 내용을 어찌 확인할 수 있을까 고민하여 찾은 방법 입니다. 실제로는 아주 간단하게 EXE 파일을 추출할 수 있습니다.

위와 같이 윈도우 기본 프로그램인 워드패드를 이용하여 열면 위와 같이 표시되게 되며 해당 아이콘을 드래그 앤 드롭으로 바탕화면이나 폴더에 떨구면 EXE 파일이 생성됩니다. 생성된 파일을 비교해 보도록 하겠습니다.

C:\Users\ByJJoon\Downloads\RTF>md5sum final.bin
f96aa9da4f47cff01019a143bc8eedf4 *final.bin

C:\Users\ByJJoon\Downloads\RTF>md5sum dem2001_10.exe
f96aa9da4f47cff01019a143bc8eedf4 *dem2001_10.exe

동일하군요. 이렇게 간단하게 추출이 가능하나....노가다로 분석을 한 이유는 RTF 포맷을 이해하기 위한 것이라는 핑계를 대야 겠네요 😀

  • EOF -

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다