User Tools

Site Tools


packing

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
packing [2025/04/29 20:21] ppalepacking [2025/12/01 11:40] (current) – external edit 127.0.0.1
Line 4: Line 4:
 Iako naziv zadatka odaje o čemu je riječ, korisno je znati kako prepoznati "pakiranu" datoteku. Iako naziv zadatka odaje o čemu je riječ, korisno je znati kako prepoznati "pakiranu" datoteku.
 Najčešći pokazatelj je izlaz funkcije strings koja vraća besmislene stringove (ne postoje nazivi funkcija itd...). Najčešći pokazatelj je izlaz funkcije strings koja vraća besmislene stringove (ne postoje nazivi funkcija itd...).
-Drugi pokazatelj su besmislene instrukcije koje se izvršavaju pokušajem debuggiranja. Smiao "Pakiranja" je da se oteža ručni reversing, kao i prepoznavanje malwarea.+Drugi pokazatelj su besmislene instrukcije koje se izvršavaju pokušajem debuggiranja. Smiao "pakiranja" je da se oteža ručni reversing, kao i otežati automatsko prepoznavanje malwarea.
  
 Dva su načina kako se pakirane datoteke mogu otpakirati. Prvi je da se sazna kojim programom je datoteka zapakirana, a drugi je ručno unpackanje. U nastavku su objašnjena oba načina, na primjeru zadatka Packer.  Dva su načina kako se pakirane datoteke mogu otpakirati. Prvi je da se sazna kojim programom je datoteka zapakirana, a drugi je ručno unpackanje. U nastavku su objašnjena oba načina, na primjeru zadatka Packer. 
Line 10: Line 10:
 === 1. Otkrivanje packera ===  === 1. Otkrivanje packera === 
  
-Kako bi se otkrio koji paker je korišten mogu se iskoristiti alati/usluge za analizu, poput VirusTotal. VirusTotal +Kako bi se otkrilo koji alat za "pakiranje" je korištenmogu se iskoristiti alati/usluge za analizu, poput VirusTotal. VirusTotal je web aplikacija koja analizira malware korištenjem pattern matchinga i sl. Također, prepoznaje poznate packereako su korišteni za obfusciranje datoteke.  
-jest web aplikacija koja analizira malware korištenjem pattern matchinga i sl. Također, prepoznaje poznate packere  +Rezultat analize ovog zadatka vraća naziv "kiteshield". Kiteshield je open source packer za datoteke ELF formata. Može se pronaći ovdje [[https://github.com/GunshipPenguin/kiteshield|ovdje]]. Kako bi se datoteka unpackala mogu se pronaći razni writeupovi na tu temu (npr. [[https://blog.xlab.qianxin.com/kiteshield_packer_is_being_abused_by_linux_cyber_threat_actors/|ovdje]]).
-ako su korišteni za obfusciranje datoteke.  +
-Rezultat analize nam vraća naziv kiteshield. Kiteshield je open source packer za datoteke ELF formata. Može se pronaći  +
-ovdje [[https://github.com/GunshipPenguin/kiteshield|ovdje]]. Kako bi se datoteka unpackala mogu se pronaći razni writeupovi +
-na temu (npr. [[https://blog.xlab.qianxin.com/kiteshield_packer_is_being_abused_by_linux_cyber_threat_actors/|ovdje]]).+
 Korištenjem skripte za unpackanje jednostavno se dobije originalna main funkcija.  Korištenjem skripte za unpackanje jednostavno se dobije originalna main funkcija. 
  
Line 24: Line 20:
 === 2. Ručno unpackanje === === 2. Ručno unpackanje ===
  
-Recimo da se radi o packeru koji nije poznat, tj. ne postoje već dostupne skripte za unpackanje. Ne preostaje ništa osim +Recimo da se radi o packeru koji nije poznat, tj. ne postoje već dostupne skripte za unpackanje. Ne preostaje ništa drugo osim ručne analize koda. Dobri packeri otežavaju ručnu analizu korištenjem puno nebitnih instrukcija što čini kod nerazumljivim. 
-ručne analize koda. Dobri packeri otežavaju ručnu analizu korištenjem puno nebitnih instrukcija što čini kod nerazumljivim. +Međutim, većina packera imaju zajedničko svojstvo da koriste sistemske pozive (engl. syscallkojima alociraju prostor u memoriji (mmap) u koje se zapisuju dekriptirani payload tj. binarna datoteka, postavljaju  
-Međutim, većina packera imaju zajedničko svojstvo da pozivaju syscall-ove kojima alociraju prostor u memoriji (mmap) u koje +potrebne permissione (mprotect), otvaraju razne datoteke poput libc.so (read) itd... Znajući to, debuggiranje se može olakšati zaustavljanjem na pozivima naredbe syscall. 
-se zapisuju dekriptirani payload tj. binarna datoteka, postavljaju  +
-potrebne permissione (mprotect), otvaraju razne datoteke poput libc.so (read) itd... Znajući to, debuggiranje se može olakšati  +
-zaustavljanjem na pozivima instrukcije syscall. +
  
 {{catchsyscall.png}} {{catchsyscall.png}}
Line 41: Line 34:
   6. exit   6. exit
  
-Nakon poziva read program izlazi te je očito da se radi o nekoj vrsti anti-debugging mjere. Prije exita poziva se syscall read  +Nakon poziva "readprogram završava (exit) te je očito da se radi o nekoj vrsti anti-debugging mjere. Prije exita poziva se syscall read s putanjom /proc/%d/status gdje je %d pid programa. Primjer djelomičnog ispisa jest sljedeći:
-s putanjom /proc/%d/status gdje je %d pid programa. Primjer djelomičnog ispisa jest sljedeći:+
  
 {{status.png}} {{status.png}}
  
-Unutar ispisa jedini indikator radi li se od debuggiranju jest TracerPidIspis statusa programa koji trenutačno nisu debuggirani +Vrijednost TracerPid pokazuje //process id// procesa koji se koristi za debugiranje (u ovom slučaju gdb)Programi koji nisu debugirani imaju TracerPid postavljen na vrijednost 0. Postavljanjem vrijednosti TracerPid na nula pomoću naredbe patchmožemo uvjeriti program da nije debugiran.
-imaju postavljen TracerPid na vrijednost 0. Kada bi se ispis izmijenio na 0postoji mogućnost da se mjera zaobiđe.+
  
 {{patch.png}} {{patch.png}}
  
-Uz pomoć naredbe patch ručno se izmijeni njegova vrijednost. 
  
 {{fork.png}} {{fork.png}}
Line 65: Line 55:
 {{childfork.png}} {{childfork.png}}
  
-Praćenjem syscallova vidimo sličan uzorak kao i u parent procesu. Nakon poziva setrlimit ponovno se dohvaća pid +Praćenjem syscallova vidimo sličan uzorak kao i u parent procesu. Nakon poziva "setrlimitponovno se dohvaća pid 
 te gleda /proc/%d/status. te gleda /proc/%d/status.
  
Line 73: Line 63:
 {{vmmap.png}} {{vmmap.png}}
  
-Očito je da je proces unpackanja završio. Korištenjem naredbe "dump binary memory dump.out 0x0000000800000000 0x0000000800005000" +Očito je da je proces unpackanja završio. Korištenjem naredbe "dump binary memory dump.out 0x0000000800000000 0x0000000800005000" dobije se dump binarne datoteke. 
-dobije se dump binarne datoteke. +
  
-Iako je zbog načina obfuskacije koju kiteshield koristi kod obfusciran (ne može se pokrenuti) za ovaj zadatak to je dovoljno jer  +Iako je zbog načina obfuskacije koju kiteshield koristi kod obfusciran (ne može se pokrenuti) za ovaj zadatak to je dovoljno jer je string za flag hardkodiran te se može dobiti naredbom strings.
-je string za flag hardkodiran te se može dobiti naredbom strings.+
  
-"The second layer of encryption (referred to in the codebase as the "inner layer") consists of individual encryption of almost every function  +"The second layer of encryption (referred to in the codebase as the "inner layer") consists of individual encryption of almost every function in the input binary (identified via the symbol table at pack-time). A ptrace-based runtime engine is triggered on every function entry and exit via replacement of each function's entry instruction and all its return instructions with int3 instructions (which deliver a SIGTRAP when executed). 
-in the input binary (identified via the symbol table at pack-time). A ptrace-based runtime engine is triggered on every function entry and exit  +Upon receiving a trap, the runtime engine looks up the current function and encrypts or decrypts it as needed such that only functions within the current call stack are decrypted at any point in time."
-via replacement of each function's entry instruction and all its return instructions with int3 instructions (which deliver a SIGTRAP when executed). +
-Upon receiving a trap, the runtime engine looks up the current function and encrypts or decrypts it as needed such that only functions within the current +
-call stack are decrypted at any point in time."+
  
 Ideja je da int3 instrukcije šalju signal ptraceru koji dinamički dekriptira funkciju koja se izvršava. Izgled main funkcije u dobivenom dumpu jest: Ideja je da int3 instrukcije šalju signal ptraceru koji dinamički dekriptira funkciju koja se izvršava. Izgled main funkcije u dobivenom dumpu jest:
Line 89: Line 74:
 {{main_func.png}} {{main_func.png}}
  
-Jasno je da je funkcija ne izvršiva zbog invalidnih instrukcija.+Jasno je da se funkcija ne može izvršiti zbog invalidnih instrukcija.
  
 Za usporedbu, ovo je izgled iste funkcije kroz binarnu datoteku dobivenu korištenjem jednih od skritpti za unpackanje kiteshielda: Za usporedbu, ovo je izgled iste funkcije kroz binarnu datoteku dobivenu korištenjem jednih od skritpti za unpackanje kiteshielda:
packing.1745958085.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki