Pitanje:
Raspakiranje binarnih datoteka na generički način
Remko
2013-03-20 20:25:47 UTC
view on stackexchange narkive permalink

Otkrivam da se sve češće binarne datoteke pakiraju s exe zaštitnicima kao što su upx, aspack itd. Pokušao sam slijediti nekoliko vodiča o tome kako ih raspakirati, ali primjeri su često prilično jednostavni, dok moje ciljne skupine nisu.

Tražim dobre resurse i bilo kakve savjete / savjete o raspakiranju ciljeva.

[Lena tutoriali] (http://tuts4you.com/download.php?list.17) proradit će mnoge tehnike koje ćete vidjeti u mnogim paketima. Postoje neki vodiči koji se više usredotočuju na pucanje, ali oni obično također imaju dobre informacije.
Znate li za: [Eter: Analiza zlonamjernog softvera putem proširenja za virtualizaciju hardvera] (http://ether.gtisc.gatech.edu/)
Tri odgovori:
#1
+63
Igor Skochinsky
2013-03-20 23:57:25 UTC
view on stackexchange narkive permalink

Raspakiranje generičkog pakiranja ili kriptora obično uključuje sljedeće korake:

1. Pratite kôd, moguće izbjegavajući ili zaobilazeći provjere protiv uklanjanja pogrešaka.

To nije teško s jednostavnim pakirima, ali s naprednijim može biti nezgodno. Oni mogu upotrijebiti provjere vremena ( rdtsc ), prijenos kontrole na temelju iznimki, upotrebu registara za uklanjanje pogrešaka za izračune itd. Korištenje VM-a ili emulatora ovdje obično pomaže protiv većine njih.

2. Pronađite izvornu ulaznu točku (OEP)

Postoji mnogo načina za to. Ponekad je skok na OEP očit kad slijedi komad petljenog koda, a za njim nema ničega razumnog. Ili možete prepoznati kôd na OEP-u ako ste upoznati s ulaznim točkama koje su proizveli različiti prevoditelji. Još nekoliko trikova:

  1. ako paker spremi izvorne registre prije raspakiranja, postavite hardversku točku prekida na njihovo mjesto u stogu - na ovaj način ćete se slomiti odmah kad su obnovljeno prije preskakanja na OEP.

  2. ako tijekom praćenja možete prepoznati memoriju gdje se nepakirani kôd piše, postavite točku prekida izvršavanja stranice na taj memorijski opseg - aktivirat će se nakon skok. IDA vam omogućuje da postavite takvu točku prekida, a mislim i OllyDbg.

  3. postavite točke prekida na uobičajene API-je koje koristi početni kôd, npr. GetCommandLine ili GetVersionEx . Ovo vam neće pružiti točan OEP, ali obično se možete vratiti natrag na poziv i pronaći ga više-manje lako.

3. Izbacite raspakirani kôd

Ako koristite IDA, zapravo ne trebate dump datoteku u zasebnu datoteku - dovoljno je napraviti snimku memorije koja bi kopirala bajtova iz memorije u bazu podataka da biste ih kasnije mogli analizirati. Ovdje treba imati na umu da ako je paker koristio dinamički dodijeljenu memoriju, trebate ga označiti kao "loader" (Utovarivač) kako bi se uključio u snimku. Više ovdje.

4. Vrati uvoz

Nisam dobro upoznat kako se to radi u Ollyju ili nekom drugom programu za uklanjanje pogrešaka, ali AFAIK morate na svom odlagalištu koristiti alat poput ImpREC i kopiju postupka u memoriji.

Nešto je jednostavnije (IMO) u IDA-i. Samo trebate pronaći tablicu uvoza i preimenovati pokazivače prema funkcijama na koje trenutno upućuju (to bi trebalo učiniti dok je program za uklanjanje pogrešaka aktivan). Možete koristiti skriptu renimp.idc ili UUNP "značajku ručne rekonstrukcije" (pogledajte ovdje).

Za pronalaženje tablice uvoza postoje dva trika I ponekad koristite:

  • slijedite neke pozive u početnom kodu na OEP-u da biste pronašli vanjske API-je, a to bi vas trebalo dovesti do tablice uvoza. Obično su početak i kraj tablice očigledni.

  • tijekom raspakiranja, postavite točku prekida na GetProcAddress i pogledajte gdje su rezultati zapisani. Međutim, ovo neće raditi s pakirima koji koriste ručno rezultiranje uvozom pomoću direktorija za izvoz. Ovdje bi moglo pomoći stavljanje pročitanog BP-a na izvoznu tablicu kernel32-a.

5. Čišćenje

Ovo nije obavezno, ali može biti korisno ukloniti ostatke koda pakera koji bi vam samo odvlačili pažnju. U IDA-i biste također trebali primijeniti potpis FLIRT-a prevoditelja ako prepoznate korišteni kompajler.

6. Izrada raspakirane izvršne datoteke

Ne radim ovaj korak jer rijetko moram pokrenuti raspakiranu datoteku, ali općenito obično trebate popraviti zaglavlje PE tako da se pomaci koda odjeljka u datoteci podudaraju s onima na odlagalištu.


Sada postoje mnoge varijacije i trikovi koji nisu obuhvaćeni gornjim koracima. Na primjer, neki pakeri u početku ne rješavaju u potpunosti uvoz, već stavljaju skokove na kvarove koji rješavaju uvoz na prvi poziv, a zatim ga popravljaju, tako da sljedeći put ide izravno na cilj. Zatim postoji pristup "ukradenog koda" koji otežava pronalaženje i oporavak OEP-a. Ponekad paker pokreće svoju kopiju i otklanja pogreške, tako da joj ne možete priložiti vlastiti program za ispravljanje pogrešaka (to se može riješiti upotrebom emulatora ili programa za ispravljanje pogrešaka koji ne koristi API-je za uklanjanje pogrešaka poput Intel PIN-a). Ipak, navedeni koraci mogu pokriti prilično puno onoga što je vani.

Zaključit ću videozapisom koji je Elias snimio i prikazuje postupak raspakiranja Lakog kompresora: https: //www.hex -rays.com/video/bochs_video_2.html

dobar odgovor (+1) i nesumnjivo IDA igra veliku ulogu općenito u RCE, ali mislim da svoj odgovor ne biste trebali ograničiti samo na IDA (da, vidio sam spominjanje ImpReca i OllyDbg).
@0xC0000022L: Nažalost, nisam upoznat s raspakiravanjem u OllyDbg, znam to samo u teoriji. Ali mislim da se većina mog odgovora može koristiti s bilo kojim programom za otklanjanje pogrešaka (zapravo, ne bih uopće rekao da je "ograničen" na IDA). Ipak biste mogli dodati svoj vlastiti odgovor o raspakiranju u OllyDbg!
lijep odgovor, evo alata: http://ether.gtisc.gatech.edu/
@IgorSkochinsky Zapravo sam vrlo sretan što ste ovdje pokrili IDA, jer iskreno, postoji mnoštvo informacija o tome kako to učiniti u Olly / x64 na Tuts4You i drugdje, ali ne mnogo o tome kako to učiniti u IDA Pro. Jako sam zahvalan na ovome jer sam u IDA Pro naučio potpuno novi način za potpuno rješavanje ovog problema. Imate li još prijedloga IDA Pro za rješavanje ovog problema novijeg od ovog posta (dodaci / blogovi / itd.)? Hvala Igore.
#2
+13
94c3
2013-03-22 05:28:10 UTC
view on stackexchange narkive permalink

Igorov odgovor je vrlo dobar. Međutim, opisane tehnike oslanjaju se na pretpostavku da se izvršna datoteka u nekom trenutku otpakira u memoriju. To nije uvijek točno. Obfusaktori virtualizacije kompajliraju izvornu binarnu datoteku u prilagođeni skup uputa kada ih simulator izvršava za vrijeme izvođenja. Ako naiđete na binarno zamagljeni na ovaj način, ne preostaje vam ništa drugo nego napisati rastavljač iz prilagođenog skupa uputa u skup uputa koji razumijete.

Da, spomenuo sam da govorim o zamotavanju paketa.
Pa, tehnički čak i VM zaštitnici ostavljaju datoteku raspakiranu u memoriji, tj. Još uvijek rade kao "omotnici za pakiranje". Jedina je razlika u tome što je puno teže razumjeti kod koji je zaštićen VM-om, čak i ako je "na vidiku".
@newgre:, ipak, neće svi otpakirati sve odjednom. Tako ćete možda završiti samo s komadićima.
Koji VM pakeri to rade?
newgre, možete li objasniti kako je mogući 3. korak Igorovog postupka kada je jedina stvar u memoriji bajt kod za randomizirani skup instrukcija? Jedini način da se na ovaj način izbaci izvršna datoteka zaštićena je pisanje rastavljača za bajt kod.
Postoji nekoliko mogućnosti nakon što naiđete na takvu binarnu datoteku, evo jedne - https://github.com/jnraber/VirtualDeobfuscator
#3
+5
rj_
2014-05-10 15:00:42 UTC
view on stackexchange narkive permalink

Portal Blackstorm ima ogromnu kolekciju vodiča za raspakiranje Vodiči za Blackstorm portal

Tuts4You ima još jednu veliku kolekciju vodiča za raspakiranje Tuts4You

U početku mi je trebalo puno vremena, ali s vremenom je raspakiranje postalo puno lakše, ipak je bilo potrebno puno strpljenja i prakse.



Ova pitanja su automatski prevedena s engleskog jezika.Izvorni sadržaj dostupan je na stackexchange-u, što zahvaljujemo na cc by-sa 3.0 licenci pod kojom se distribuira.
Loading...