A Kaspersky blogján jelent meg egy érdekes bejegyzés, melyben az AV szakértők a nyilvánosság segítségét kérik a DuQu egy kódrészletének elemzéséhez. A kérdéses programrész a C&C kommunikációt és az új funkciók betöltését valósítja meg, de egyelőre nem világos, hogy a bináris kód milyen nyelvből és milyen fordítóval készült.
A kód legfontosabb tulajdonságai, hogy teljesen objektum-orientált, az objektumok függvénypointereit tartalmazó tábla az osztálypéldányokban tárolódik, és futásidőben változtatható, a beépített és a felhasználó által kreált objektumok között nem lehet különbséget tenni, a Windows API közvetlenül kerül felhasználásra, a futás pedig alapvetően eseményvezérelt. .Net-es segítségnek vagy JIT kódnak nincs nyoma.
A fentiek alapján elsőre felmerülő nyelveket a szakértők - akik azt sem tartják lehetetlennek, hogy egy teljesen új nyelv készült a trójaihoz - kizárták, a közösség pedig már egészen vad teóriákkal állt elő az ősrégi IBM fordítók által generált kommunikációs stackektől a különböző perverz Lisp implementációkig.
A felfokozott hagulatot William Pitcock igyekszik letörni, aki szerint a kasperskys arcoknak simán le kéne tenniük a crackpipát, ugyanis a kérdéses programrész egyszerűen a Microsoft COM technológiájával készült. A magam részéről távol állok attól, hogy meg tudjam mondani a tutit a kérdésben, minden esetre ahogy általában, most is hajlok arra, hogy a lehető legegyszerűbb megfejtés lesz a nyerő.
Ha Pitcocknak igaza van, az elég kellemetlen a Kaspersky szakértőire nézve, de nem szabad kizárnunk azt a lehetőséget sem, hogy a biztonsági cégnél csak megpróbálják kiugrasztani a nyulat a bokorból.
lpt1 2012.03.12. 18:30:20
boldii 2012.03.13. 00:58:45
Mégha igaza is lenne, azért felhívom a figyelmet, hogy immár kb. 5 napja kint a poszt és egyedül William szerint triviális a megoldás, nem sok konkurens cég rohant, hogy elmesélje ő mennyivel okosabb... Ez meg talán önmagában gyanúsabb, mint a fenti megjegyzés.
Ugyanakkor ettől még lehet, hogy COM, csak lehet, hogy ettől még valami trükk is van a rendszerben.
No mindenesetre FYI érdemes nézegetni az eredeti Kaspersky post kommentjeit is, pl. a COM ötletre már volt válasz:
"Re: C code with use of COM?
The are actually no 'vtables' in COM / C++ meaning. There is only a list of function pointers inside the instance, it's not even separated from the data.
Reply
"
ColT · http://kilatas.great-site.net 2012.03.13. 20:40:31
buherator · http://buhera.blog.hu 2012.03.13. 20:51:27
sghctoma · http://sghctoma.extra.hu 2012.03.14. 12:56:38
idohiany miatt nem nagyon tudtam belefolyni ebbe a dologba, igy az eredeti post kommentjeit sem olvastam, de az a valasz, amit beideztel, nem igazan korrekt.. nem letezik olyan, hogy " 'vtables' in COM / C++ meaning".. az, hogy egy fordito hogyan valositja meg a vtable koncepciot (illetve, hogy egyaltalan megvalositja-e) sehol nincs megkotve.. igazabol azt nem ertem, hogy miert kell teljesen uj nyelvrol beszelni, mikor siman lehet, hogy csak nem valamelyik "standard" forditoval csinaltak a binarist.. ha malware-t irnek, tuti nem szopatnam magam valami egzotikus nyelvvel, viszont szopatnam a reversereket es a virusirtokat egy egzotikus compiler/linker, vagy akar csak valami MS doksik melyerol elohalaszot specko declspec hasznalataval..
boldii 2012.03.14. 17:31:28
Egyetértek abban is, hogy lehet, hogy csak valami fura fordító volt, vagy akár csak valami extrém fordítási beállítás, ugyanakkor a kérdés ekkor is marad, hogy milyen fordító, milyen beállítás? Amit az itcafe-n írtál mintát, azt érdemes kipróbálni szerinted?
Ellenben nem hiszem, hogy direkt a reverse-t nehezítették, vagyis ez csak részben igaz. Az a fura a kódjaikban is, hogy "annyira" nem nehezítették sehol a dolgok vizsgálatát, inkább érthetetlen módon rakták össze a dolgokat. Egyik helyen így csinálják, másik helyen úgy, itt tömörítgetnek egy picit, ott meg nem, stb. Szóval inkább olyan szedettvedett a cucc, mint tudatosan a reverse ellen alakított. Ezért simán lehet, hogy ez a modulrész egy tök külön fejlesztés egy külön fejlesztőtől, vagy hasonló.
sghctoma · http://sghctoma.extra.hu 2012.03.14. 18:57:24
"Egyetértek abban is, hogy lehet, hogy csak valami fura fordító volt, vagy akár csak valami extrém fordítási beállítás, ugyanakkor a kérdés ekkor is marad, hogy milyen fordító, milyen beállítás?"
Velemenyem szerint ez szelmalomharc, es igazabol a fontossagat sem nagyon latom. Persze a hacker kivancsi fajta, en is szeretek utanajarni a dolgoknak, de itt annyifele kombinaciorol beszelunk (mar akkor is, ha csak a mainstream forditok beallitasi lehetosegeit nezzuk), hogy nem hiszem, hogy van ertelme ennyi eroforrast beleolni. Es en reszben erre ertettem a szopatast. Egy specko forditonal/linkernel termeszetesen sokkal kifinomultabb anti-re modszerek leteznek, de mokas lehet latni, ahogy a fel vilag napokat tolt el azzal, hogy megprobalja kitalalni, hogy mivel forgattam a cuccot.
Par dolog, ami beugrott, mikor elolvastam az eredeti postot:
Azt az event passing-es mokat nem hiszem, hogy bele kene keverni, es rogton feltetelezni, hogy az nyelvi feature. Nem egy hasonlo hazi megoldast lehet latni pl. jatekokban, C/C++-hoz.
Igazabol ket dolog fura a kodban. Az egyik az, hogy az objektumokban helyezi el az egesz vtable-t, es nem csak egy pointert pakol az objektum elejere/vegere.
A masik pedig, hogy nem egysegesen hasznalja a calling convention-oket (ezt nem is feltetlenul a fordito csinalja, erre postoltam azt a snippet-et a prohardveren), illetve a fastcall (thiscall) szeru konvencional cserelgeti a hasznalt regisztereket (na, olyen forditot nem ismerek, amiben ezt lehetne allitgatni).
"Amit az itcafe-n írtál mintát, azt érdemes kipróbálni szerinted?"
Az csak annyit demonstral, hogy a cl-nel alapertelmezett __thiscall-t le lehet cserelni. En __stdcall-ra csereltem, az eredeti blogon levo IDA screenshotokon ha jol remlik, __cdecl van.
Szerintem amit lehet csinalni, az az, hogy irni egy minimal C++ programot egy darab osztallyal, aminek van egy virtualis metodusa, es raereszteni a leheto legtobb compilert. Aztan mindegyikbol disas lista, es kozelebbrol megvizsgalni (kulonos tekintettel a thiscall szeru konvencio regiszter-hasznalatara) azokat a forditokat, amik a vtable-t ugy ahogy van, beledobjak az objektum elejere (mar ha lesz ilyen). Persze ez most feltetelezi, hogy C++-rol van szo, nyilvan ki lehet probalni hasonlot tobbfele nyelvvel is. De en tenyleg nagyon meglepodnek, ha ez nem valami mainstream nyelv lenne.
boldii 2012.03.15. 22:11:36
cloudbreaker.co · http://cloudbreaker.co 2012.03.19. 23:29:33
www.securelist.com/en/blog/677/The_mystery_of_Duqu_Framework_solved