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/31 16:06] mbunicrev2_angr [2025/12/01 11:40] (current) – external edit 127.0.0.1
Line 2: Line 2:
  
  
-Prije nego što pročitate ovaj članak, preporučse čitanje ovog članka:+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]] [[rev2_ghidra|CTF writeup - rev2-Ghidra]]
Line 11: Line 11:
 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 49: 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 86: 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 112: 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.
  
 {{ rev2_angr: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 123: 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.
Line 163: 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 171: 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 210: 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 239: 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.1761926794.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki