štvrtok 30. apríla 2009

CR4CK ME (časť 1.)

Tento blog voľne nadväzuje na predchádzajúcu programátorskú úlohu, tentokrát sa pozriem na úlohu pre analytikov počítačových infiltrácií. Ako Java programátor som našťastie v bežnom živote vzdialený milióny riadkov kódu od assembleru, ale kto by odolal výzve. :)

! VAROVANIE: tento článok obsahuje riešenie, alebo jeho časti, ktoré môžu, ale nemusia byť správne, každopádne ak ste úlohu ešte neriešili a chcete si ju urobiť samostatne, tak ďalej nečítajte a vráťte sa k tomuto textu až keď si budete chcieť porovnať svoje zistenia !

Zadanie úlohy je možné nájsť na http://www.3537.sk/virusovy-analytik.html a skrátene znie takto:

Predložená úloha - program s názvom ESET_crackme.exe bol navrhnutý za účelom otestovania vašich schopností v oblasti reverzného inžinierstva programov. Vašou úlohou je vykonať analýzu tohto programu (jeho programového kódu). Analýza programu (programového kódu) podáva komplexné informácie o činnosti programu, podmienkach potrebných pre vykonanie určitých akcií v programe a podobne. Programový kód môže obsahovať skryté texty, podmienené úlohy, ochranu pred ladiacimi programami a pod.

Prvá vec, ktorú vyskúšam je proste EXE súbor iba spustiť, aby som vedel ako sa správa keď ho neladím a aby som vedel ako sa javí bežnému užívateľovi.
  • prvý pokus...rezidentná ochrana môjho antivíru mi zablokovala prístup k súboru s tým že je to možno vírus, :) mno nič vypnem antivír
  • druhý pokus...rezidentná ochrana môjho anti-adware programu mi zablokovala prístup k súboru, taktiež som ju vypol
  • tretí pokus...program vypíše chybové hlásenie, v zmysle, že mu chýba knižnica rtl70.bpl, nevadí stiahnem požadovanú knižnicu a nakopírujem ju do systémového adresára
  • štvrtý pokus...hurá :) program vypíše informačný text do konzoly, počká si na stlačenie klávesy a skončí
Pamätám si, že kedysi strašne dávno som si naprogramoval niečo v C++ Builderi 3 a keď som sa s tým chcel pochváliť kamarátovi, tak ma čakalo podobné nemilé prekvapenie, u mňa samozrejme program bežal, ale u každého kto nemal nainštalovaný C++ Builder alebo Delphi bol problém. Každopádne môj prvý dojem z programu je taký, že bol asi napísaný ako konzolová aplikácia v Pascale konkrétne v Delphi 7 a ak v ňom bol použitý assembler, tak asi len inline priamo v Pascalovských zdrojákoch.

Predtým ako má vôbec zmysel začať ladiť tento program je potrebné zistiť či je skomprimovaný a keď áno tak čím. Na tento účel existuje určite množstvo nástrojov, ja som si zvolil PEiD.



Ako je zrejmé z obrázkov, tak po miernej zmene nastavenia z Normal Scan na Hardcore Scan, PEiD identifikuje, že súbor je skomprimovaný programom UPX. Čo je dobrá správa, pretože UPX je open source, to znamená, že je ho možné voľne stiahnuť, existuje k nemu verejná dokumentácia a sú verejné aj jeho zdrojové kódy. Najjednoduchší spôsob ako teda súbor rozpakovať je stiahnuť si UPX a skúsiť to automaticky.



Hmmm, až také ľahké to nebude, zrejme bola PE hlavička nejakým spôsobom modifikovaná, ale "vygooglit" si podrobný návod ako rozpakovať UPX manuálne dokonca aj s odkazmi na zdrojový kód UPX a vysvetlivkami je len otázkou chvíľky. V návode pre riešiteľov sa odporúča ako veľmi dobrý ladiaci program OllyDbg, tak v ňom teda otvorím ESET_crackme.exe a privíta ma hlásením, ktoré ma upozorňuje, že analýza kódu bude zrejme chybná, lebo telo programu je skomprimované.



Návod na manuálne rozbalenie UPX archívu hovorí, že je potrebné hľadať inštrukciu POPAD (inštrukcia obnoví registre pre všeobecné použitie zo zásobníka, je to prakticky opak inštrukcie PUSHAD, na ktorej sa práve nachádzame), ktorú nasleduje inštrukcia JMP (inštrukcia urobí nepodmienený skok). Tak si vyhľadáme [Ctrl-S], [] Entire block, POPAD.



Na ďalšom obrázku je vidieť, že sme úspešne našli inštrukciu POPAD, za ktorou sa nachádza nepodmienený skok JMP a práve naň si dáme breakpoint [F2].



Spustíme program [F9] až po breakpoint a posunieme sa ešte o jednu inštrukciu [F7] cez náš JMP a mali by sme mať rozpakovaný program a zároveň by sme mali byť nastavení na originálnom vstupnom bode aplikácie.



Keďže by bolo zbytočné tento postup opakovať zakaždým keď budeme ladiť program, tak použijeme plugin na dumpovanie procesov a vytvoríme si týmto spôsobom nový EXE súbor, ale už rozpakovaný a s novým entry pointom ako je to na nasledujúcich dvoch obrázkoch.



Keď už máme rozpakovaný program, urobíme si na ňom takú predbežnú analýzu, aby sme zistili aký má potenciál. Napríklad, pracuje zo súbormi? Zapisuje alebo číta niečo z registrov windows? Komunikuje s inými počítačmi? Na to aby sme zistili či má program potenciál robiť nasledovné veci si ho otvoríme v programe IDA Pro Free. A budeme skúmať aké knižnice používa, aké funkcie windows volá a aké textové reťazce obsahuje, ale to až v budúcej časti, ak si nájdem čas a ak sa mi bude chcieť. :)