Domanda:
Analisi di JavaScript altamente offuscato
Adam Caudill
2013-04-01 08:27:20 UTC
view on stackexchange narkive permalink

Recentemente stavo analizzando una pagina web che conteneva JavaScript altamente offuscato: è chiaro che l'autore ha fatto un bel po 'di sforzi per renderlo il più difficile da capire possibile. Ho visto diverse varianti di questo codice: ci sono abbastanza somiglianze che è chiaro che hanno la stessa fonte, ma abbastanza diverse che la soluzione per deoffuscare cambia ogni volta.

Ho iniziato eseguendo l'URL attraverso VirusTotal, che ha ottenuto un punteggio di 0/46, quindi era qualcosa di interessante e non veniva rilevato dal software antivirus (almeno staticamente). Successivamente ho provato a eseguirlo tramite jsunpack per vedere se poteva avere un senso: senza fortuna, ha rotto il parser.

Guardando il codice, c'erano alcuni metodi progettati per creare confusione, quindi diversi KB di stringhe come questa che alla fine sarebbero stati decodificati come javascript ed eseguiti:

  22 = "; 4kqkk; 255ie; 35bnh; 4mehn; 2lh3b; 7i29n ; 6m2jb; 7jhln; 562ik ... " 

Dopo aver scavato per alcuni minuti sono stato in grado di determinare che il bit di codice su cui ho davvero cardato era questo:

  try {document.body -} catch (dgsdg) {e (a);}  

In questo caso e era stato alias eval e a era una stringa che era stata manipolata dalle varie funzioni all'inizio del file (e passata attraverso una serie di assegnazioni fuorvianti).

Per ottenere rapidamente il valore di a ho modificato il codice in Base64 codificarlo e visualizzare il valore, quindi ho aperto il file HTML in Chrome su una VM (disconnesso fr om the network):

  document.write (window.btoa (a))  

Questo è stato in grado di farmi ottenere il valore che stavo cercando, ma il processo ha richiesto troppo tempo e se avessi perso un altro eval è possibile che avrei potuto eseguire quello che era chiaramente codice dannoso. Così ho potuto ottenere ciò di cui avevo bisogno e identificare il malware che stavo cercando di eliminare, ma il processo era troppo lento e rischioso.

Esistono modi migliori per eseguire JavaScript come questo in una sandbox sicura per ridurre al minimo i rischi associati all'esecuzione? Non vedo in alcun modo che uno strumento possa essere costruito per deoffuscare genericamente questo tipo di codice, quindi non vedo alcun modo per eseguirlo (o creare strumenti una tantum, che richiede anche tempo).

Sarei interessante sentire parlare di altri strumenti e tecniche per trattare questo tipo di codice.

[Questa risposta] (http://reverseengineering.stackexchange.com/questions/64/what-is-a-good-tools-to-reverse-the-effects-of-minify-on-javascript/115#115) può essere pertinente ai tuoi interessi.
Voto per chiudere questo perché sembra un esatto imbroglione, inoltre è difficile darti consigli senza codice.
Possibile duplicato di [Qual è un buon strumento per invertire gli effetti di Minify su JavaScript?] (Https://reverseengineering.stackexchange.com/questions/64/what-is-a-good-tools-to-reverse-the- effetti-di-minify-su-javascript)
Nove risposte:
#1
+36
svent
2013-04-04 02:46:12 UTC
view on stackexchange narkive permalink

Sono l'autore di JSDetox, grazie a Jurriaan Bremer per averlo menzionato!

Come già detto ogni schema di offuscamento è diverso. JSDetox non cerca di deoffuscare tutto automaticamente: lo scopo principale è supportare l'analisi manuale.

Ha due caratteristiche principali: l'analisi statica cerca di ottimizzare il codice "gonfio", ad es. istruzioni come

  var x = - ~ - ~ 'bp' [720094129.0.toString (2 << 4) + ""] * 8 + 2;  

può essere risolto in

  var x = 34;  

poiché non ci sono dipendenze esterne.

La seconda caratteristica è la capacità di eseguire codice JavaScript con emulazione HTML DOM: si può caricare un documento HTML (opzionale) e un file JavaScript, eseguire il codice e vedere cosa succederebbe. Ovviamente questo non sempre funziona immediatamente e potrebbero essere necessarie correzioni manuali.

JSDetox intercetta chiamate come "eval ()" o "document.write ()" (cosa hai fatto a mano) e mostra ciò che verrebbe eseguito, consentendo ulteriori analisi. L'emulazione HTML DOM consente l'esecuzione di codice che interagisce con un documento HTML, ad esempio:

  document.write ('<div id = "AU4Ae" >212< / div> '); var OoF2wUnZ = parseInt (document.getElementById ("AU4Ae"). innerHTML); if (OoF2wUnZ == 212) {...  

Vedi http : //relentless-coding.org/projects/jsdetox/samples per ulteriori esempi o guarda gli screencast: http://relentless-coding.org/projects/jsdetox/screencasts

JSDetox non esegue il codice JavaScript analizzato nel browser, utilizza V8 (motore JS del browser Chrome) sul backend, tuttavia dovrebbe essere eseguito in una macchina virtuale isolata.

Svent scusa per tirare in ballo un vecchio thread. Prima di tutto grazie per uno strumento fantastico. Ho un problema in cui btoa () non viene riconosciuto. Potrebbe essere che sto facendo qualcosa di sbagliato. Sto provando a farlo: data = btoa (junk); document.write (dati); Grazie
@k0ng0 Il problema è che btoa () è una funzione dell'oggetto finestra nei browser e non una caratteristica del linguaggio JavaScript. JSDetox attualmente emula solo le funzioni selezionate dell'oggetto finestra. Grazie per il suggerimento, approfondirò questo aspetto con la prossima versione.
In primo luogo, grazie per il lavoro sul tuo strumento, tuttavia, ogni volta che inserisco del codice offuscato e premo "analizza", dice solo "caricamento ..." e non carica mai nulla. L'ho lasciato per 10 minuti.
#2
+17
Mick
2013-04-04 09:13:39 UTC
view on stackexchange narkive permalink

Sono un fan di Malzilla e del suo motore JS SpiderMonkey incorporato che ti consente di decodificare javascript dannosi.

enter image description here

Ecco un tutorial che utilizza Malzilla per decodificare un attacco LuckySploit.

Puoi scaricare il file binario predefinito per Malzilla su SourceForge, qui.

Questa potrebbe essere una vecchia risposta, ma per salvare chiunque altro confusione totale e inutile, tutti i binari sono di una sorta di strumento chiamato "InnoBF" anche se si trovano nei percorsi Malzilla sul Source Forge collegato. Devi effettivamente compilare dai sorgenti, ma è scritto in Delphi / Kylex / qualunque cosa, quindi sì, molto divertente.
Ti stai sbagliando. Il binario malzilla è precostruito e può essere scaricato da Sourceforge (come collegato sopra): https://sourceforge.net/projects/malzilla/files/Malzilla%20Win32%20Binary%20package/Malzilla%201.2.0/
#3
+11
peter ferrie
2013-04-01 09:26:24 UTC
view on stackexchange narkive permalink

La soluzione migliore è utilizzare un ambiente (ad es. FireFox) in cui eval () può essere sovrascritto utilizzando una funzione proxy, e la funzione stampa solo l'output. In questo modo, non vi è alcun rischio di perdere qualcosa, anche se il malware lo crea. Sfortunatamente, eval () non è progettato per essere sovrascritto (e credo sia esplicitamente vietato dalle recenti specifiche ECMAScript), ma nel peggiore dei casi non verrà eseguito.

Sei il modo migliore ... "Sfortunatamente, eval () non è progettato per essere sovrascritto" ... nessun suggerimento su come sovrascriverlo o con cosa sovrascriverlo?
#4
+9
Denis Laskov
2013-04-01 19:15:16 UTC
view on stackexchange narkive permalink

Bene, dopo gli strumenti online, puoi usare Revelo di KahuSecurity http://www.kahusecurity.com/tools/Revelo_v0.5.1.zip Ha meno automazione nel processo, ma più potente in de-offuscamento di js personalizzati. La documentazione è inclusa in ZIP, potresti anche vedere esempi del suo utilizzo nel blog Kahu: http://www.kahusecurity.com/ p.s. non dimenticare di usare VM!

#5
+7
Jurriaan Bremer
2013-04-03 00:56:24 UTC
view on stackexchange narkive permalink

Potresti essere fortunato a provare JSDetox, http://www.relentless-coding.com/projects/jsdetox, che è un decompressore javascript + html automatizzato in Ruby, o la mia libreria che è in lavorazione e supporta solo javascript (ma fa un po 'di più di JSDetox), https://github.com/jbremer/jsunpck.

Per JSDetox puoi dare l'html come input attraverso l'interfaccia web, penso, e poi sputerà del codice ottimizzato (cioè deoffuscato.) Il mio jsunpck, tuttavia, accetta semplicemente un file javascript sulla riga di comando.

Come sempre , il successo con uno degli strumenti non è garantito, ma chi lo sa. Alla fine, potresti essere più interessato a un approccio dinamico, come applicare le patch a eval come descritto sopra.

#6
+6
Gunther
2013-04-06 19:22:49 UTC
view on stackexchange narkive permalink

Beh, personalmente utilizzerei JSDetox ( http://relentless-coding.org/projects/jsdetox) se mi sento pigro ad analizzarlo manualmente.

Probabilmente è uno degli strumenti migliori in circolazione.

#7
+5
thisismalicious
2013-04-03 01:03:42 UTC
view on stackexchange narkive permalink

Potresti provare http://jsunpack.jeek.org/ che funziona per alcune cose. Personalmente utilizzo solo la console JS integrata di Chrome in una VM, sostituendo eval ().

Anche questo potrebbe essere utile, sebbene sia più utile per migliorare la leggibilità.

#8
+4
api pota
2017-11-06 13:54:32 UTC
view on stackexchange narkive permalink

Oltre agli altri link utili qui, consiglio di provare Malware-Jail

Sandbox per analisi semiautomatica del malware Javascript, deoffuscamento ed estrazione del payload. Scritto per Node.js

malware-jail è scritto per la sandbox "vm" di Node. Attualmente implementa il contesto WScript (Windows Scripting Host) env / wscript.js, almeno la parte usata frequentemente dal malware. Il contesto del browser Internet è parzialmente implementato env / browser.js.

Controlla il repository Github per saperne di più e vedere il suo utilizzo e l'output di esempio.

#9
+1
Giulio Muscarello
2017-09-22 05:07:12 UTC
view on stackexchange narkive permalink

Nell'ultimo anno ho sviluppato box-js e ho trovato che fosse lo strumento più accurato durante l'analisi dei contagocce JScript. Internamente, utilizza UglifyJS2 per eseguire un'analisi statica e semplificare molte tecniche di offuscamento; il resto si ottiene tramite l'emulazione in una sandbox V8.



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...