Detekce vzorů v binárních spustitelných souborech

Post on 15-Feb-2017

73 views 4 download

transcript

Detekce vzoru v binarnıch spustitelnych souborech

Milan Zavoral

vedoucı: Ing. Peter Matula

Struktura zpetneho prekladace

Detekce vzoru v binarnıch spustitelnych souborech 2 / 10

Detekce vzoru ve zpetnem prekladaci

zadanı

sjednotit a vylepsit existujıcımetody detekce vzoru

doplnit metody pro detekcinovych typu vzoru

pouzity prekladac ci packer

staticky linkovany kod (pomaladetekce)

odlisne formaty signatur

chybejıcı detekcekryptografickych konstrukcı

chybejıcı detekce zranitelnostı askodliveho kodu

Detekce vzoru v binarnıch spustitelnych souborech 3 / 10

Detekce vzoru ve zpetnem prekladaci

zadanı

sjednotit a vylepsit existujıcımetody detekce vzoru

doplnit metody pro detekcinovych typu vzoru

pouzity prekladac ci packer

staticky linkovany kod (pomaladetekce)

odlisne formaty signatur

chybejıcı detekcekryptografickych konstrukcı

chybejıcı detekce zranitelnostı askodliveho kodu

Detekce vzoru v binarnıch spustitelnych souborech 3 / 10

Detekce vzoru ve zpetnem prekladaci

zadanı

sjednotit a vylepsit existujıcımetody detekce vzoru

doplnit metody pro detekcinovych typu vzoru

pouzity prekladac ci packer

staticky linkovany kod (pomaladetekce)

odlisne formaty signatur

chybejıcı detekcekryptografickych konstrukcı

chybejıcı detekce zranitelnostı askodliveho kodu

Detekce vzoru v binarnıch spustitelnych souborech 3 / 10

Detekce vzoru ve zpetnem prekladaci

zadanı

sjednotit a vylepsit existujıcımetody detekce vzoru

doplnit metody pro detekcinovych typu vzoru

pouzity prekladac ci packer

staticky linkovany kod (pomaladetekce)

odlisne formaty signatur

chybejıcı detekcekryptografickych konstrukcı

chybejıcı detekce zranitelnostı askodliveho kodu

Detekce vzoru v binarnıch spustitelnych souborech 3 / 10

Detekce vzoru ve zpetnem prekladaci

zadanı

sjednotit a vylepsit existujıcımetody detekce vzoru

doplnit metody pro detekcinovych typu vzoru

pouzity prekladac ci packer

staticky linkovany kod (pomaladetekce)

odlisne formaty signatur

chybejıcı detekcekryptografickych konstrukcı

chybejıcı detekce zranitelnostı askodliveho kodu

Detekce vzoru v binarnıch spustitelnych souborech 3 / 10

Puvodnı detekce vzoru

pouzity prekladac ci packer

signatury

{

"ExePack",

"1.4",

"by Jon Snow",

0,

0,

"33C08BC0 --68---C;",

}

Detekce vzoru v binarnıch spustitelnych souborech 4 / 10

Puvodnı detekce vzoru

pouzity prekladac ci packer

signatury

{

"ExePack",

"1.4",

"by Jon Snow",

0,

0,

"33C08BC0 --68---C;",

}

heuristiky

Detekce vzoru v binarnıch spustitelnych souborech 4 / 10

Puvodnı detekce vzoru

pouzity prekladac ci packer

signatury

{

"ExePack",

"1.4",

"by Jon Snow",

0,

0,

"33C08BC0 --68---C;",

}

heuristiky

staticky linkovany kod

.0001111000011111010110111110000111100101101110000011110

| 1 N 20 D4ED 005C 1 0000 __do_global_dtors

Detekce vzoru v binarnıch spustitelnych souborech 4 / 10

Sjednocenı signatur — YARA pravidla

{

"ExePack ",

"1.4 ",

"by Jon Snow",

0,

0,

"33C08BC0 --68--- C;",

}

rule exe_pack {

meta:

name = "ExePack "

version = "1.4"

comment = "by Jon Snow"

strings :

$1 = { 33 C0 8B C0 ?? 68 ?? ?C }

condition :

$1 at entrypoint

}

.0001111000011111010110111110000111100101101110000011110

| 1 N 20 D4ED 005C 1 0000 __do_global_dtors

rule do_global_dtors_aux {

meta:

patternSet = "1 N 20 D4ED 005C 1 0000 __do_global_dtors"

strings :

$1 = { ( 0F | 8F ) 0F AD F0 F2 DC 1E }

condition :

$1

}

Detekce vzoru v binarnıch spustitelnych souborech 5 / 10

Sjednocenı signatur — YARA pravidla

{

"ExePack ",

"1.4 ",

"by Jon Snow",

0,

0,

"33C08BC0 --68--- C;",

}

rule exe_pack {

meta:

name = "ExePack "

version = "1.4 "

comment = "by Jon Snow"

strings :

$1 = { 33 C0 8B C0 ?? 68 ?? ?C }

condition :

$1 at entrypoint

}

.0001111000011111010110111110000111100101101110000011110

| 1 N 20 D4ED 005C 1 0000 __do_global_dtors

rule do_global_dtors_aux {

meta:

patternSet = "1 N 20 D4ED 005C 1 0000 __do_global_dtors"

strings :

$1 = { ( 0F | 8F ) 0F AD F0 F2 DC 1E }

condition :

$1

}

Detekce vzoru v binarnıch spustitelnych souborech 5 / 10

Sjednocenı signatur — YARA pravidla

{

"ExePack ",

"1.4 ",

"by Jon Snow",

0,

0,

"33C08BC0 --68--- C;",

}

rule exe_pack {

meta:

name = "ExePack "

version = "1.4 "

comment = "by Jon Snow"

strings :

$1 = { 33 C0 8B C0 ?? 68 ?? ?C }

condition :

$1 at entrypoint

}

.0001111000011111010110111110000111100101101110000011110

| 1 N 20 D4ED 005C 1 0000 __do_global_dtors

rule do_global_dtors_aux {

meta:

patternSet = "1 N 20 D4ED 005C 1 0000 __do_global_dtors"

strings :

$1 = { ( 0F | 8F ) 0F AD F0 F2 DC 1E }

condition :

$1

}

Detekce vzoru v binarnıch spustitelnych souborech 5 / 10

Sjednocenı signatur — YARA pravidla

{

"ExePack ",

"1.4 ",

"by Jon Snow",

0,

0,

"33C08BC0 --68--- C;",

}

rule exe_pack {

meta:

name = "ExePack "

version = "1.4 "

comment = "by Jon Snow"

strings :

$1 = { 33 C0 8B C0 ?? 68 ?? ?C }

condition :

$1 at entrypoint

}

.0001111000011111010110111110000111100101101110000011110

| 1 N 20 D4ED 005C 1 0000 __do_global_dtors

rule do_global_dtors_aux {

meta:

patternSet = "1 N 20 D4ED 005 C 1 0000 __do_global_dtors"

strings :

$1 = { ( 0F | 8F ) 0F AD F0 F2 DC 1E }

condition :

$1

}

Detekce vzoru v binarnıch spustitelnych souborech 5 / 10

Sjednocenı signatur — vysledky

detekce prekladace ci packeru

vyssı vyjadrovacı sıla, rozsırenı o 28 novych heuristik

detekce staticky linkovaneho kodu

urychlenı detekce

Detekce vzoru v binarnıch spustitelnych souborech 6 / 10

Sjednocenı signatur — vysledky

detekce prekladace ci packeru

vyssı vyjadrovacı sıla, rozsırenı o 28 novych heuristik

detekce staticky linkovaneho kodu

urychlenı detekce

0

50

100

150

200

250

300

350

400

stacofinl 1.0 stacofinl 2.0

Min

uty

Doba vykonávání

∼ 10 000 testovacıch souboruDetekce vzoru v binarnıch spustitelnych souborech 6 / 10

Detekce dalsıch vzoru

kryptograficke a kompresnı funkce

2368 pravidel

skodlivy kod a zranitelnosti

2181 pravidel

Detekce vzoru v binarnıch spustitelnych souborech 7 / 10

Detekce dalsıch vzoru

kryptograficke a kompresnı funkce

2368 pravidel

skodlivy kod a zranitelnosti

2181 pravidel

rule laudanum {

strings :

$s1 = "public function __activate ()" fullword ascii

$s2 = " register_activation_hook (__FILE__ , array(’

WP_Laudanum ’, ’activate ’))" fullword ascii

condition :

filesize < 5KB and all of them

}

Detekce vzoru v binarnıch spustitelnych souborech 7 / 10

Detekce dalsıch vzoru

kryptograficke a kompresnı funkce

2368 pravidel

skodlivy kod a zranitelnosti

2181 pravidel

rule laudanum {

strings :

$s1 = "public function __activate ()" fullword ascii

$s2 = " register_activation_hook (__FILE__ , array(’

WP_Laudanum ’, ’activate ’))" fullword ascii

condition :

filesize < 5KB and all of them

}

vystup pro uzivatele (text)

informace pro zpetny prekladac (JSON)

Detekce vzoru v binarnıch spustitelnych souborech 7 / 10

Vyuzitı pri zpetnem prekladu

originalnı kodstatic unsigned int crc_32_tab [] = {...};

Detekce vzoru v binarnıch spustitelnych souborech 8 / 10

Vyuzitı pri zpetnem prekladu

originalnı kodstatic unsigned int crc_32_tab [] = {...};

puvodnı resenıint32_t g1 = 0;

Detekce vzoru v binarnıch spustitelnych souborech 8 / 10

Vyuzitı pri zpetnem prekladu

originalnı kodstatic unsigned int crc_32_tab [] = {...};

puvodnı resenıint32_t g1 = 0;

nove resenı{

"endian" : "little",

"matches" : [

{

"address " : 4231264 ,

"entrySize " : 4,

"offset" : 28768,

"size " : 1024,

"type " : "integral "

}

],

"name " : "CRC_32_IEEE_802_3_poly_0x04C11DB7 ",

"type " : "crypto"

}

Detekce vzoru v binarnıch spustitelnych souborech 8 / 10

Vyuzitı pri zpetnem prekladu

originalnı kodstatic unsigned int crc_32_tab [] = {...};

puvodnı resenıint32_t g1 = 0;

nove resenı{

"endian" : "little",

"matches" : [

{

"address " : 4231264 ,

"entrySize " : 4,

"offset" : 28768,

"size " : 1024,

"type " : "integral "

}

],

"name " : "CRC_32_IEEE_802_3_poly_0x04C11DB7 ",

"type " : "crypto"

}

// Detected cryptographic pattern: CRC_32_IEEE_802_3_poly_0x04C11DB7

int32_t CRC_32_IEEE_802_3_poly_0x04C11DB7_at_409060 [256] = {...};

Detekce vzoru v binarnıch spustitelnych souborech 8 / 10

Vyuzitı pri zpetnem prekladu

int32_t __do_global_ctors (void );

int32_t __do_global_dtors (void );

int32_t __main(void );

int32_t __mingw_get_msvcrt_han (int32_t a1)

;

int32_t __mingw_TLScallback (int32_t a1);

...

int32_t function_401560 (char * a1, int32_t

a2) {

int32_t v1 = 4 * a2, v2 = 0x186a0;

int32_t v3 = -1, v4 = (int32_t )a1;

while (true ) {

int32_t v5 = v3, v6 = v4;

if (a2 != 0) {

uint32_t v7 = v3, v8 = v4;

unsigned char v9 = *(char *)v8;

int32_t v10 = *( int32_t *)(4 * ((

int32_t)v9 ^ v7 % 256) + (

int32_t)&g2);

int32_t v11 = v10 ^ v7 / 256;

while (a2 != 1) {

a2 --; v7 = v11 , v8 += 4;

v9 = *(char *)v8;

v10 = *( int32_t *)(4 * ((

int32_t)v9 ^ v7 % 256) +

(int32_t )&g2);

v11 = v10 ^ v7 / 256;

}

...

}

Detekce vzoru v binarnıch spustitelnych souborech 9 / 10

Vyuzitı pri zpetnem prekladu

int32_t __do_global_ctors (void );

int32_t __do_global_dtors (void );

int32_t __main(void );

int32_t __mingw_get_msvcrt_han (int32_t a1)

;

int32_t __mingw_TLScallback (int32_t a1);

...

int32_t function_401560 (char * a1, int32_t

a2) {

int32_t v1 = 4 * a2, v2 = 0x186a0;

int32_t v3 = -1, v4 = (int32_t )a1;

while (true ) {

int32_t v5 = v3, v6 = v4;

if (a2 != 0) {

uint32_t v7 = v3, v8 = v4;

unsigned char v9 = *(char *)v8;

int32_t v10 = *( int32_t *)(4 * ((

int32_t)v9 ^ v7 % 256) + (

int32_t)&g2);

int32_t v11 = v10 ^ v7 / 256;

while (a2 != 1) {

a2 --; v7 = v11 , v8 += 4;

v9 = *(char *)v8;

v10 = *( int32_t *)(4 * ((

int32_t)v9 ^ v7 % 256) +

(int32_t )&g2);

v11 = v10 ^ v7 / 256;

}

...

}

int32_t CRC 32(char * a1 , int32_t a2) {

int32_t v1 = 4 * a2, v2 = 0x186a0;

int32_t v3 = -1, v4 = (int32_t)a1;

while (true ) {

int32_t v5 = v3 , v6 = v4;

if (a2 != 0) {

uint32_t v7 = v3 , v8 = v4;

unsigned char v9 = *(char *)

v8;

int32_t v10 = *( int32_t *)(4

* (( int32_t)v9 ^ v7 %

256) + (int32_t)&

CRC 32 at 409060) ;

int32_t v11 = v10 ^ v7 / 256;

while (a2 != 1) {

a2 --; v7 = v11 , v8 += 4;

v9 = *(char *)v8;

v10 = *( int32_t *)(4 * ((

int32_t )v9 ^ v7 %

256) + (int32_t )&

CRC 32 at 409060);

v11 = v10 ^ v7 / 256;

}

...

}

Detekce vzoru v binarnıch spustitelnych souborech 9 / 10

Zaver

sjednocenı ruznych formatu signatur

jednotna detekce vzoru (YARA)

rozdılna interpretace detekovanych vzoru (metadata)

urychlenı detekce staticky linkovaneho kodu

detekce kryptografickych konstrukcı

detekce skodliveho kodu a zranitelnostı

zvysenı citelnosti vystupnıho kodu

Detekce vzoru v binarnıch spustitelnych souborech 10 / 10

Zaver

sjednocenı ruznych formatu signatur

jednotna detekce vzoru (YARA)

rozdılna interpretace detekovanych vzoru (metadata)

urychlenı detekce staticky linkovaneho kodu

detekce kryptografickych konstrukcı

detekce skodliveho kodu a zranitelnostı

zvysenı citelnosti vystupnıho kodu

https://retdec.com

Detekce vzoru v binarnıch spustitelnych souborech 10 / 10

Otazky oponenta

”V praci popisujete, ze pro detekci skodliveho kodu je nutne nejprve zjistitinformace o pouzitem prekladaci a packeru (coz lze provest naprıklad nazaklade signatur). Co se stane v prıpade, ze se utocnık pokusı tytoinformace podvrhnout za ucelem zmatenı detektoru?“

Otazky oponenta

”V praci popisujete, ze pro detekci skodliveho kodu je nutne nejprve zjistitinformace o pouzitem prekladaci a packeru (coz lze provest naprıklad nazaklade signatur). Co se stane v prıpade, ze se utocnık pokusı tytoinformace podvrhnout za ucelem zmatenı detektoru?“

detekce prekladace ci packeru nenı obecne nutna

nekolik zdroju detekce prekladace ci packeru

signatury

importovane funkce a knihovny

resources

kontrolnı soucty

retezcove literaly, regularnı vyrazy...

vlastnosti sekcı a datovych struktur (ruzne hlavicky a oddıly v souboru)

behavioralnı popis (Cuckoo Sandbox + YARA)

Otazky oponenta

”V zaveru prace se zminujete, ze dosazene vysledky bude mozne vyuzıt imimo rekonfigurovatelny zpetny prekladac (napr. v systemu proautomatickou shlukovou analyzu skodliveho kodu). Pokuste se myslenkupodrobneji priblızit.“

Otazky oponenta

”V zaveru prace se zminujete, ze dosazene vysledky bude mozne vyuzıt imimo rekonfigurovatelny zpetny prekladac (napr. v systemu proautomatickou shlukovou analyzu skodliveho kodu). Pokuste se myslenkupodrobneji priblızit.“

AVG: 150 000 vzorku / den

informace o vstupnım souboru + detekovana YARA pravidla

hashovanı, vytvorenı popisu vzorku

analyza shluku a trıdenı do skupin dle virovych rodin

usnadnuje praci analytiku

Zıskavane informace

souborovy format

architektura, bitova sırka

vstupnı bod

prekladac nebo packer

informace z hlavicek

prıznaky (flags)

typ souboru

endianita

OS, kontrolnı soucet...

sekce, segmenty

symboly

importy, exporty

relokace

dynamicke sekce (ELF)

adresare dat (PE)

resources (PE)

rich header (PE)

informace o PDB (PE)

specificke analyzy (ARM, MIPS)

originalnı jazyk

obsah souboru

CRC32, MD5, SHA-256

Heuristicka detekce prekladace ci packeru

polymorfnı packery

1C 1C 26 08 3E B0 0F 6D FF 6D F5 35 BF C7 C0

74 08 52 55 66 C1 C4 10 5D 5A 51 51 0A C9 59

51 0F B6 C9 77 05 25 FF FF FF FF F8 E2 F3 59

-- -- -- -- -- -- -- -- -- -- -- -- -- -- --

Heuristicka detekce prekladace ci packeru

polymorfnı packery

1C 1C 26 08 3E B0 0F 6D FF 6D F5 35 BF C7 C0

74 08 52 55 66 C1 C4 10 5D 5A 51 51 0A C9 59

51 0F B6 C9 77 05 25 FF FF FF FF F8 E2 F3 59

-- -- -- -- -- -- -- -- -- -- -- -- -- -- --

if( file_format == PE &&

target_architecture == INTEL X86 &&

EP_file_offset >= 0x400 &&

EP_file_offset <= 0x1400 &&

data_directories[1].size == 0x1000 &&

sections[0].name == ".text" &&

sections[1].name == ".data" &&

sections[2].name == ".idata" &&

sections[2].size == 0x200)

{

return "Morphine 1.2";

}

Detekce prekladace ci packeru

Detekce staticky linkovaneho kodu

Detekce dalsıch vzoru

Pouzite nastroje a metodiky

C++

yara

OllyDbg (reverznı inzenyrstvı)

diagram trıd UML

testovanı

jednotkove testy

regresnı testy

srovnavacı testy

vykonnostnı testy

knihovny

ELFIO

PeLib

LLVM

libyara

libdwarf

Portable C++ Hashing Library

TinyXml-2

JsonCpp

Google Test

Ukazka vystupu nastroje fileinfo

Input file : fileName

CRC32 : e7cb47b5

MD5 : 81513 f15b771280ffd0e...

SHA256 : fd3c77fc24415923a9b5...

File format : ELF

File class : 64-bit

File type : Executable file

Architecture : x86 -64

Endianness : Little endian

Entry point address : 0x405d10

Entry point offset : 0x5d10

Entry point section index: 12

Entry point section name : .text

Bytes on entry point : 554889 e541554c...

Detected compiler/packer : GHC (7.6.3)

Original language : Haskell

Ukazka vystupu nastroje fileinfo

i type flags offset vaddr memsize align

-------------------------------------------------------------------------------

i - index

type - type of segment

flags - segment flags

offset - offset in file

vaddr - virtual address in memory

memsize - size in memory

align - alignment in memory and in file

-------------------------------------------------------------------------------

i type flags offset vaddr memsize align

-------------------------------------------------------------------------------

0 PHDR rx 0x00040 0x400040 0x001c0 0x000008

1 INTERP r 0x00200 0x400200 0x00015 0x000001

2 LOADABLE rx 0 0x400000 0xabfcc 0x200000

3 LOADABLE rw 0xac000 0x6ac000 0x15488 0x200000

4 DYNAMIC rw 0xac030 0x6ac030 0x001d0 0x000008

5 NOTE r 0x00218 0x400218 0x00018 0x000004

6 OS -specific r 0xa5898 0x4a5898 0x0138c 0x000004

7 OS -specific rwx 0 0 0 0x000010

-------------------------------------------------------------------------------

Flags:

r - readable

x - executable

w - writable

Ukazka vystupu nastroje fileinfo

i type flags offset vaddr memsize align

-------------------------------------------------------------------------------

i - index

type - type of segment

flags - segment flags

offset - offset in file

vaddr - virtual address in memory

memsize - size in memory

align - alignment in memory and in file

-------------------------------------------------------------------------------

i type flags offset vaddr memsize align

-------------------------------------------------------------------------------

0 PHDR rx 0x00040 0x400040 0x001c0 0x000008

1 INTERP r 0x00200 0x400200 0x00015 0x000001

2 LOADABLE rx 0 0x400000 0xabfcc 0x200000

3 LOADABLE rw 0xac000 0x6ac000 0x15488 0x200000

4 DYNAMIC rw 0xac030 0x6ac030 0x001d0 0x000008

5 NOTE r 0x00218 0x400218 0x00018 0x000004

6 OS -specific r 0xa5898 0x4a5898 0x0138c 0x000004

7 OS -specific rwx 0 0 0 0x000010

-------------------------------------------------------------------------------

Flags :

r - readable

x - executable

w - writable

Ukazka vystupu nastroje stacofin

4016b0 10 0 ___udiv_w_sdiv

4019f0 10 0 ___udiv_w_sdiv

402740 2c 0 ???

405dcd 10 0 ___bid_truncdddf - alternatives:

___bid_fixdddi ___bid_truncddsf ___bid_fixddsi

___bid_extendddxf ___bid_gtdd2 _isinfd64

___bid_nedd2 ___bid_extendsddf

___bid_truncsdsf ___bid_extendsdxf

___bid_unorddd2

40723f 10 0 ___clear_cache

407570 140 0 ___umoddi3

4076b0 110 0 ___udivdi3