detekce vzorů v binárních spustitelných souborech
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