Mining Malware Secrets
Paul Black
Federation University
Arun Lakhotia
University of Louisiana at Lafayette
Mining Malware Secrets Paul Black Arun Lakhotia Federation - - PowerPoint PPT Presentation
Mining Malware Secrets Paul Black Arun Lakhotia Federation University University of Louisiana at Lafayette Introductions Paul Black Arun Lakhotia Malware Analyst 5 years Professor of Computer Science CEO, Cythereal,
Federation University
University of Louisiana at Lafayette
Paul Black
Federation Uni
– Decryption of Zeus Configuration File Arun Lakhotia
years
Genome
0x11a23: push esi mov edx,56CH push edx push 403AA8H push eax call 1443AH 0x11a35: mov ecx,dptr(4342FCH) add ecx,dptr(4346DCH) mov esi,edx sub ecx,eax 0x11a45: mov dl,bptr(esp+eax*1) xor bptr(eax),dl inc eax dec esi jnz 11A45H 0x11a4e: pop esi retn
Copy configuration buffer Decryption loop Access decryption key Mem Copy
41C6EA 56 push esi 416CEB BA 6C 05 00 00 mov edx, 56Ch 41C6F0 52 push edx 41C6F1 68 A8 3A 40 00 push 403AA8H 41C6F6 50 push eax 41C6F7 E8 C5 C9 00 00 call 143AAH 41C6FC 8B 0D FC 42 43 00 mov ecx, 4342FCH 41C702 03 0D DC 46 43 00 add ecx, 4346DCH 41C708 8B F2 mov esi, edx 41C70A 2B C8 sub ecx, eax
Config Buffer Size Config Buffer Start Pointer Xor key
41C6EA 56 416CEB BA 6C 05 00 00 41C6F0 52 41C6F1 68 A8 3A 40 00 41C6F6 50 41C6F7 E8 C5 C9 00 00 41C6FC 8B 0D FC 42 43 00 41C702 03 0D DC 46 43 00 41C708 8B F2 41C70A 2B C8
Config Buffer size Config Buffer Start Pointer Xor Key 56 BA [4] 52 68 [4] 50 E8 [4] 8B [5] 03 [5] 8B F2 2B C8
– Run malware – Dump memory – Run volatility plugin – * Locate code segment – * Extract secrets
bytes
– Strings, Data, Instructions
– Malware are frequently updated
– Requires manual verification
– Because sample is old – Might be unknown variant – Updated version of known malware – May not be the expected family
push ebp mov ebp,esp sub esp,4 mov eax, DWORD ebp+4 mov DWORD ebp+8,eax mov eax, DWORD ebp mov DWORD ebp-4,eax
Code
eax = def(ebp) ebp = -4+def(esp) esp = -8+def(esp) memdw(-8+def(esp))= def(ebp) memdw(-4+def(esp))= def(ebp) memdw(4+def(esp)) = def(memdw(def(esp)))
Semantics
Instruction dependent Order dependent Instruction independent Order independent
mov(ecx,ebp) sub(ecx,63) mov(dptr(ecx+59),eax) pop(ecx) lea(eax,wptr(ebp-28)) push(edi) mov(edi,1148415812)
push(esi) mov(esi,-1545600507)
pop(esi) push(edi) mov(edi,ebp) mov(ecx,edi) pop(edi) push(eax) mov(eax,63) sub(ecx,eax) pop(eax) mov(dptr(ecx+59),eax) pop(ecx) lea(eax,wptr(ebp-28)) push(edi) mov(edi,880280128) push(esi) mov(esi,268135684) add(edi,esi) pop(esi)
Semantics
cmp(bptr(esi),al) push(edx) mov(dl,al) cmp(bptr(esi),dl) pop(edx) mov(bptr(edi),al) push(ecx) mov(cl,al) mov(bptr(edi),cl) pop(ecx) cmp(al,0) push(ebx) mov(bh,0) cmp(al,bh) pop(ebx) mov(ebx,1684957510) mov(ebx,251658400) xor(ebx,1802398182) mov(cl,0) mov(ecx,1342369920) mov(cl,69) sub(cl,69)]
Sensitive to behavior addition
41C6EA 56 push esi 416CEB BA 6C 05 00 00 mov edx, 56Ch 41C6F0 52 push edx 41C6F1 68 A8 3A 40 00 push 403AA8H 41C6F6 50 push eax 41C6F7 E8 C5 C9 00 00 call Mem::copy 41C6FC 8B 0D FC 42 43 00 mov ecx, 4342FCH 41C702 03 0D DC 46 43 00 add ecx, 4346DCH 41C708 8B F2 mov esi, edx 41C70A 2B C8 sub ecx, eax 56 BA
Config Buffer Size Config Buffer Start Pointer Xor key
41C6EA 56 push esi 416CEB BA 6C 05 00 00 mov edx, 56Ch 41C6F0 52 push edx 41C6F1 68 A8 3A 40 00 push 403AA8H 41C6F6 50 push eax 41C6F7 E8 C5 C9 00 00 call Mem::copy 41C6FC 8B 0D FC 42 43 00 mov ecx, 4342FCH 41C702 03 0D DC 46 43 00 add ecx, 4346DCH 41C708 8B F2 mov esi, edx 41C70A 2B C8 sub ecx, eax
ecx=dptr(0x4342fc,def(ds)) +dptr(0x4346dc,def(ds))
esi=def(edx) edx=0x56c esp=-16+def(esp), memdw(-16+def(esp))=def(eax) memdw(-12+def(esp))=0x403aa8 memdw(-8+def(esp))=0x56c memdw(-4+def(esp))=def(esi)
0x11a23: push esi mov edx,56CH push edx push 403AA8H push eax call 1443AH 0x11a35: mov ecx,dptr(4342FCH) add ecx,dptr(4346DCH) mov esi,edx sub ecx,eax 0x11a45: mov dl,bptr(esp+eax*1) xor bptr(eax),dl inc eax dec esi jnz 11A45H 0x11a4e: pop esi retn 0x54fa: push esi mov edx,330H push edx push 2D80H push eax call CB8CH 0x550c: mov esi,dptr(20980H) mov ecx,dptr(204d4H) add ecx,esi sub ecx,eax mov esi,edx 0x551e: mov dl,bptr(esp+eax*1) xor bptr(eax),dl inc eax dec esi jnz 551EH 0x5527: pop esi retn
ecx=dptr(0x20980,def(ds)) +dptr(0x204d4,def(ds))
esi=def(edx) edx=0x330 esp=-16+def(esp), memdw(-16+def(esp))=def(eax) memdw(-12+def(esp))=0x2d80 memdw(-8+def(esp))=0x330 memdw(-4+def(esp))=def(esi) ecx=dptr(0x4342fc,def(ds)) +dptr(0x4346dc,def(ds))
esi=def(edx) edx=0x56c esp=-16+def(esp), memdw(-16+def(esp))=def(eax) memdw(-12+def(esp))=0x403aa8 memdw(-8+def(esp))=0x56c memdw(-4+def(esp))=def(esi)
register renaming
constants/addresses
constants
ecx=dptr(D,def(ds)) +dptr(E,def(ds))
esi=def(edx) edx=A esp=-16+def(esp), memdw(-16+def(esp))=def(eax) memdw(-12+def(esp))=B memdw(-8+def(esp))=C memdw(-4+def(esp))=def(esi) ecx=dptr(D,def(ds)) +dptr(E,def(ds))
esi=def(edx) edx=A esp=-16+def(esp), memdw(-16+def(esp))=def(eax) memdw(-12+def(esp))=B memdw(-8+def(esp))=C memdw(-4+def(esp))=def(esi)
❶ ❸ ❷ ❹ ❶ Unpack ❷ Use juice for features ❸ Create indexes ❹ Search
VM VM HYPERVISOR
Google Cloud Unpack Extract Juice Index Cluster Classify Search
– “Search” for functions semantically similar to an example
– Extract parameters from abstract state For every function found:
from abstract state
sha1[4] static_config config_size xor_offset version count 0c4d 0x401668 0x328 0x422a3c+0x422ee8 0x1020500 11 56f9 0x402638 0x388 0x4237f4+0x423ca0 0x1020600 20 ac52 0x4018c8 0x3b8 0x423adc+0x423f88 0x1020700 1 836a 0x401578 0x360 0x41a2e4+0x41a790 0x2000700 5 8a2f 0x402d80 0x330 0x4204d4+0x420980 0x2000700 5 8a7f 0x402b98 0x34c 0x422adc+0x422f88 0x2000807 1 70d1 0x401690 0x31c 0x422a64+0x422f10 0x2000809 1 7084 0x4018b8 0x2e8 0x422d7c+0x423228 0x2010001 1
Federation University p.black@federation.edu.au
University of Louisiana at Lafayette arun@Louisiana.edu arun@cythereal.com
– control flow graph, call graph – Bindiff, Malwise
– Instructions – Graph structure
– Peek in code (Use Yara) – Byte/Instruction order
No known implementation