Komplex Malware Analysis

이 내용은 개인적으로 바이너리를 분석한 내용으로 상세한 내용은 다음 글을 참조 바람.

Sofacy’s ‘Komplex’ OS X Trojan - Paloalto Networks

Komplex Mac backdoor answers old questions - Malware Bytes

라운드 1

라운드 2

라운드 3(마지막)

설정 파일 디코딩

라운드 3의 바이너리에 ‘0x9230 to 0x92F4’ 위치의 196 바이트를 디코딩해야 함. 디코딩 키는 11바이트의 XOR 키로 인코딩 되어 있으며 디코딩 루틴은 다음과 같음.

import sys
from ctypes import *

class _ConfigFile(LittleEndianStructure):
    _fields_ = [
        ('Filename', c_ubyte*0x8),
        ('PathtoSave', c_ubyte*10),
        ('BlockShell', c_ubyte*5),
        ('StartBlockFile', c_ubyte*6),
        ('BlockExecute', c_ubyte*7),
        ('BlockDelete', c_ubyte*6),
        ('EndBlockFile', c_ubyte*7),
        ('XORKEY', c_ubyte*15),
        ('MainServer', c_ubyte*0x18),
        ('BackupServer1', c_ubyte*0x18),
        ('BackupServer2', c_ubyte*0x18),
        ('MAC', c_ubyte*3),
        ('Config', c_ubyte*6),
        ('GetConfig', c_ubyte),
        ('Files', c_ubyte*4),
        ('Log', c_ubyte*3),
        ('OldConfig', c_ubyte*1),
        ('ID', c_ubyte*2),
        ('Token', c_ubyte*10),
        ('Dummy', c_ubyte*10),	# Unused
        ('Extensions', c_ubyte*20)
    ]

def _memcpy(buf, fmt):
    return cast(c_char_p(buf), POINTER(fmt)).contents

xorkey = [0x60, 0x55, 0x66, 0x45, 0x53, 0x19, 0x01, 0x72, 0x6C, 0x46, 0x3E]
xorsize = len(xorkey)

### MD5 (configfile) = ef3471eaddd0683fba4880a380607973
### config file offset : 0x9230 to 0x92F4 (196 bytes)
f = open('configfile', 'rb')
buf = f.read()
f.close()

EncConfig = _memcpy(buf, _ConfigFile)


for f,t in _ConfigFile._fields_:
    if f == 'Dummy' or f == 'XORKEY':
        continue
    field = getattr(_ConfigFile, f)
    offset = field.offset
    datasize = field.size
    output = ''
    if f == 'Extensions':
        for fileoff in xrange(0, datasize):
            output += chr((ord(buf[offset+fileoff]) ^ xorkey[fileoff%5]));
    else:
        for fileoff in xrange(0, datasize):
            output += chr((ord(buf[offset+fileoff]) ^ xorkey[fileoff%xorsize]));

    print '%s : %s'%(f, output.replace('\x00','')) 	# print type

수행 결과

$ python xor.py
Filename : FileName
PathtoSave : PathToSave
BlockShell : Shell
StartBlockFile : [file]
BlockExecute : Execute
BlockDelete : Delete
EndBlockFile : [/file]
MainServer : appleupdate.org
BackupServer1 : apple-iclouds.net
BackupServer2 : itunes-helper.net
MAC : mac
Config : config
GetConfig : 1
Files : file
Log : log
OldConfig : 2
ID : id
Token : h8sn3vq6kl
Extensions : .xml.pdf.htm.zip