Junk Code: Obfuscated Code Execution/Junk Code Insertion (T1027.016)
Gli attaccanti inseriscono codice spazzatura nei loro malware per confondere gli analisti e rallentare le indagini. Questa tecnica consiste nell'aggiungere istruzioni che non vengono eseguite o che, se eseguite, non modificano il comportamento del programma. Il risultato è un file binario gonfiato artificialmente con blocchi di codice inutile che rendono l'analisi statica e dinamica significativamente più complessa.
La tecnica rientra nella tattica TA0005 (Defense Evasion) della kill chain, permettendo agli avversari di nascondere le reali funzionalità del malware dietro strati di offuscamento. L'inserimento di junk code è particolarmente efficace quando combinato con altre tecniche di evasione come la compressione o il packing del software.
Attualmente 5 gruppi APT utilizzano attivamente questa tecnica, distribuendo 14 famiglie di malware documentate che implementano varie forme di code padding. L'esempio più comune sono le istruzioni NOP (No-Operation) nell'assembly x86, rappresentate dall'opcode 0x90, che vengono inserite in massa per creare sezioni di codice che il disassembler deve processare senza alcun beneficio analitico.
Per comprendere l'efficacia del junk code, iniziamo creando un semplice payload Python che dimostra il concetto. Il seguente script inserisce blocchi di codice inutile tra le funzioni legittime:
import random
import string
def real_function():
print("Funzione reale eseguita")
def junk_generator():
for i in range(1000):
dummy = ''.join(random.choices(string.ascii_letters, k=50))
useless_calc = i * random.randint(1, 100) / random.randint(1, 50)
real_function()
Per un esempio più avanzato in assembly x86, possiamo creare un binario con padding NOP massiccio. Utilizzando NASM su Linux:
section .text
global _start
_start:
; Codice reale
mov eax, 1
; Inserimento di 1000 NOP
times 1000 nop
; Altro codice reale
mov ebx, 0
int 0x80
Compiliamo con: nasm -f elf32 junk.asm && ld -m elf_i386 junk.o -o junk
FIN7 utilizza generatori automatici di junk code nei loro strumenti. Per replicare questo approccio, possiamo modificare un eseguibile esistente inserendo byte casuali tra le sezioni legittime. Su Windows, utilizzando PowerShell:
$bytes = [System.IO.File]::ReadAllBytes("legitimate.exe")
$junk = 1..10000 | ForEach {Get-Random -Maximum 255}
$newBytes = $bytes[0..1000] + $junk + $bytes[1001..$bytes.Length]
[System.IO.File]::WriteAllBytes("obfuscated.exe", $newBytes)
Gli strumenti di Kimsuky concatenano stringhe in modo creativo per offuscare il codice. Questa tecnica può essere replicata in JavaScript:
var r = "rea"; var e = "l_"; var a = "func";
var l = "tion";
eval(r + e + a + l + "()");
Per testare l'efficacia contro i sistemi di analisi automatica, Mustang Panda inserisce loop infiniti che vengono saltati condizionalmente. In C:
if (0) {
while(1) {
// Loop infinito mai eseguito
int x = rand() * rand();
}
}
// Codice malevolo reale qui
Vuoi diventare un Ethical Hacker ma non sai da dove iniziare?
Scarica la guida gratuita e segui il percorso corretto fin dal primo passo