User Tools

Site Tools


rev2_angr

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
rev2_angr [2025/10/30 16:07] mbunicrev2_angr [2025/12/01 11:40] (current) – external edit 127.0.0.1
Line 1: Line 1:
-==== Angr rješenje ====+==== Zadatak s Hacknite platforme - rev2 - rješenje pomoću alata Angr==== 
 + 
 + 
 +Prije nego što pročitate ovaj članak, preporučuje se pregled writeupa rješenja istog zadatka pomoću alata Ghidra. 
 + 
 +[[rev2_ghidra|CTF writeup - rev2-Ghidra]] 
 + 
 + 
  
 Angr je napredan i moćan alat koji se koristi za analizu binarnih izvršnih datoteka, gdje se može koristiti za reverzno inženjerstvo, automatizirano generiranje exploita, otkrivanje ranjivosti i druge namjene. Može izvršavati i statičku i dinamičku analizu, gdje je statička analiza slična kao ona koju pružaju Ghidra, Binary Ninja i slični alati, dok je dinamička analiza Angr alata njegova najjača strana. Angr je napredan i moćan alat koji se koristi za analizu binarnih izvršnih datoteka, gdje se može koristiti za reverzno inženjerstvo, automatizirano generiranje exploita, otkrivanje ranjivosti i druge namjene. Može izvršavati i statičku i dinamičku analizu, gdje je statička analiza slična kao ona koju pružaju Ghidra, Binary Ninja i slični alati, dok je dinamička analiza Angr alata njegova najjača strana.
  
-Angr pruža mogućnost tehnike simboličnog izvršavanja (symbolic execution), koja spada pod dinamičku analizu. Simbolično izvršavanje može tretirati neki korisnički unos kao neodređenu simboličnu varijablu, umjesto definirane vrijednosti, te potom tijekom rješavanja, na svakom grananju (npr. if statement), zabilježi uvjete nad simboličkom varijablom definirane za ulaz u svaku granu, i tako gradi moguće putanje izvršavanja programa. Kada nađželjenu putanju u programu, unazad riješi sve uvjete nad simboličkom varijablom, koji su potrebni da bi se program izvršio tom putanjom.+Angr pruža mogućnost tehnike simboličnog izvršavanja (symbolic execution), koja spada pod dinamičku analizu. Simbolično izvršavanje može tretirati neki korisnički unos kao neodređenu simboličnu varijablu, umjesto definirane vrijednosti. Tijekom rješavanja, na svakom grananju (npr. if statement), zabilježe se uvjeti nad simboličkom varijablom definirani za ulaz u svaku granu. Tako se grade moguće putanje izvršavanja programa. Kada je nađena željena putanja u programu, unazad se riješe svi uvjeti nad simboličkom varijablom, koji su potrebni da bi se program izvršio tom putanjom.
  
-Npr. simbolička varijabla "password" za korisnički unos u zadatku rev2, kada se dođe do prvog uvjeta koji provjerava duljinu varijable, je li jednaka 21, angr zabilježi+Npr. simbolička varijabla "password" za korisnički unos u zadatku rev2, kada se dođe do prvog uvjeta koji provjerava duljinu varijable, je li jednaka 21, Angr zabilježi
  
 <file> <file>
Line 41: Line 49:
 state.regs.rbp = state.regs.rsp state.regs.rbp = state.regs.rsp
  
-# Simbolicna varijabla - user input, duljina 21 byte+# Simbolicna varijabla - user input, duljina 21 bajt
 password = claripy.BVS("password",8*21) password = claripy.BVS("password",8*21)
  
Line 78: Line 86:
  
  
-Preporučuje se korištenje python virtual environmenta (venv) za instalaciju Angr paketa i pokretanje ove skripte.+Preporučuje se korištenje Python virtual environmenta (venv) za instalaciju Angr paketa i pokretanje ove skripte.
  
 Napravite novi direktorij, u njega stavite rev2 izvršnu datoteku i Python Angr skriptu, potom izvršite naredbe za postavljanje virtualnog okruženja: Napravite novi direktorij, u njega stavite rev2 izvršnu datoteku i Python Angr skriptu, potom izvršite naredbe za postavljanje virtualnog okruženja:
Line 93: Line 101:
 Pokretanjem ove skripte, Angr nalazi rješenje zadatka. Pokretanjem ove skripte, Angr nalazi rješenje zadatka.
  
-{{ :slika1.png?nolink&500 | Slika 1 - Rješenje zadatka s pomoću Angr-a }}+{{ rev2_angr:slika1.png?nolink&500 | Slika 1 - Rješenje zadatka s pomoću Angr-a }}
  
  
-Skripta prikazana na slici 27 ima komentare u kojima su objašnjenja koda, no još će dodatno biti objašnjeno kako se pronađe početna adresa i željena adresa za pronalazak, kao i dvije hook funkcije.+Skripta ima komentare u kojima su objašnjenja koda, no još će dodatno biti objašnjeno kako se pronađe početna adresa i željena adresa za pronalazak, kao i dvije hook funkcije.
  
 Na liniji koda 11, Na liniji koda 11,
Line 104: Line 112:
 </file> </file>
  
-Ova adresa je adresa prve instrukcije koja se izvršava u main funkciji, i prikazano je kako se može pronaći pomoću Ghidre na slici ispod+Ova adresa je adresa prve instrukcije koja se izvršava u main funkciji. Na slici je prikazano kako ju je moguće pronaći pomoću Ghidre.
  
-{{ :slika2.png?nolink&500 | Slika 2 - adresa prve instrukcije unutar main funkcije }}+{{ rev2_angr:slika2.png?nolink&500 | Slika 2 - adresa prve instrukcije unutar main funkcije }}
  
  
Line 115: Line 123:
 </file> </file>
  
-Postavlja se adresa instrukcije do koje se želi da Angr nađe put, ova adresa je adresa puts funkcije koja ispisuje "Correct!", što je ispis u slučaju kada je korisnički unos ispravan.+Postavlja se adresa ciljne instrukcije do koje se želi da Angr nađe put. Ova adresa je adresa puts funkcije koja ispisuje "Correct!", što je ispis u slučaju kada je korisnički unos ispravan.
  
 Na slici ispod je prikazano kako se može pronaći s pomoću Ghidre. Na slici ispod je prikazano kako se može pronaći s pomoću Ghidre.
  
-{{ :slika3.png?nolink&500 | Slika 3 - adresa instrukcije kojom se poziva ispis "Correct!" stringa }}+{{ rev2_angr:slika3.png?nolink&500 | Slika 3 - adresa instrukcije kojom se poziva ispis "Correct!" stringa }}
  
  
Line 132: Line 140:
 Se postavlja, jer  strcspn funkcija čita iz memorije, no kada se koristi simbolično izvršavanje, ono što bi se pročitalo iz memorije može biti neispravno definirano, zato se "ručno" postavlja koji je željeni return te funkcije i sam poziv funkcije se preskače. Se postavlja, jer  strcspn funkcija čita iz memorije, no kada se koristi simbolično izvršavanje, ono što bi se pročitalo iz memorije može biti neispravno definirano, zato se "ručno" postavlja koji je željeni return te funkcije i sam poziv funkcije se preskače.
  
-Funkcije vračaju return vrijednost preko RAX registra, mi unaprijed znamo da ova funkcija vraća duljinu unesenog korisničkog unosa i da je željena duljina korisničkog unosa 21, odnosno 0x15 hex, zato se ovo ovom linijom postavlja željena return vrijednost+Funkcije vraćaju return vrijednost preko RAX registra, mi unaprijed znamo da ova funkcija vraća duljinu unesenog korisničkog unosa i da je željena duljina korisničkog unosa 21, odnosno 0x15 hex, zato se ovo ovom linijom postavlja željena return vrijednost
  
 <file> <file>
Line 146: Line 154:
 je adresa instrukcije koja poziva izvršavanje te funkcije, na slici ispod je prikazano kako je pronađena. je adresa instrukcije koja poziva izvršavanje te funkcije, na slici ispod je prikazano kako je pronađena.
  
-{{ :slika4.png?nolink&500 | Slika 4 - adresa instrukcije koja poziva strcspn funkciju }}+{{ rev2_angr:slika4.png?nolink&500 | Slika 4 - adresa instrukcije koja poziva strcspn funkciju }}
  
  
Line 155: Line 163:
 </file> </file>
  
-je duljina koja se se preskače, odnosno na kolikom offsetu nakon što se izvrši hook na definiranoj adresi se nastavlja izvršavanje.+je duljina bajtova koja se preskače, odnosno na kolikom offsetu nakon što se izvrši hook na definiranoj adresi se nastavlja izvršavanje.
  
-Adresa instrukcije odmah nakon adrese instrukcije poziva strscpn funkcije, je+Adresa instrukcije odmah nakon adrese instrukcije poziva strcspn funkcije, je
  
 <file> <file>
Line 163: Line 171:
 </file> </file>
  
-kao što se vidi na slici 31 (MOV instrukcija, odmah nakon CALL instrukcije koja se preskače)+kao što se vidi na slici iznad (MOV instrukcija, odmah nakon CALL instrukcije koja se preskače)
  
 <file> <file>
Line 182: Line 190:
 Argumenti hook funkcije su isti kao i u prethodnom objašnjenju, u slici ispod je prikazano gdje je definirana adresa instrukcije koja poziva izvršavanje fgets funkcije. Argumenti hook funkcije su isti kao i u prethodnom objašnjenju, u slici ispod je prikazano gdje je definirana adresa instrukcije koja poziva izvršavanje fgets funkcije.
  
-{{ :slika5.png?nolink&500 | Slika 5 - adresa instrukcije koja poziva fgets funkciju }}+{{ rev2_angr:slika5.png?nolink&500 | Slika 5 - adresa instrukcije koja poziva fgets funkciju }}
  
  
Line 202: Line 210:
 Jasno je da se simbolična varijabla password želi spremiti umjesto korisničkog unosa, pa je ona drugi argument ovog poziva, no kako pronaći adresu buffera u koji fgets funkcija sprema unos? Jasno je da se simbolična varijabla password želi spremiti umjesto korisničkog unosa, pa je ona drugi argument ovog poziva, no kako pronaći adresu buffera u koji fgets funkcija sprema unos?
  
-Prvi argument je user_input, podcrtan plavom bojom na slici 31.+Prvi argument je user_input, podcrtan plavom bojom na prethodnoj slici.
  
 Pregledom koda u prikazu dekompajlirane main funkcije vidi se linija: Pregledom koda u prikazu dekompajlirane main funkcije vidi se linija:
Line 216: Line 224:
 Na slici ispod, prikazana su oba načina. Na slici ispod, prikazana su oba načina.
  
-{{ :slika6.png?nolink&500 | Slika 6 - input_buffer adresa }}+{{ rev2_angr:slika6.png?nolink&500 | Slika 6 - input_buffer adresa }}
  
  
Line 231: Line 239:
 efektivno postavlja simbolična varijabla password u input_buffer. efektivno postavlja simbolična varijabla password u input_buffer.
  
-Nakon što se fgets funkcija uspješno izvrši, ona vraća pointer na buffer u koji je upisan unos, odnosno pointer na input_buffer u ovom slučaju. Pošto funkcija vraća return rezultat preko RAX registra, samo se postavlja vrijednost RAX registra na relativnu adresu input_buffera.+Nakon što se fgets funkcija uspješno izvrši, ona vraća pointer na buffer u koji je upisan unos, odnosno pointer na input_buffer u ovom slučaju. Pošto funkcija vraća return rezultat preko RAX registra, samo se postavlja vrijednost RAX registra na relativnu adresu input buffera.
  
 <file> <file>
rev2_angr.1761840471.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki