rev2_angr
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| rev2_angr [2025/10/31 16:06] – mbunic | rev2_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ča 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, | 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, | ||
| - | 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 | + | 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 |
| - | Npr. simbolička varijabla " | + | Npr. simbolička varijabla " |
| < | < | ||
| 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 = claripy.BVS(" | ||
| Line 86: | Line 86: | ||
| - | Preporučuje se korištenje | + | Preporučuje se korištenje |
| 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: | ||
| </ | </ | ||
| - | Ova adresa je adresa prve instrukcije koja se izvršava u main funkciji, i prikazano | + | Ova adresa je adresa prve instrukcije koja se izvršava u main funkciji. Na slici je prikazano |
| {{ rev2_angr: | {{ rev2_angr: | ||
| Line 123: | Line 123: | ||
| </ | </ | ||
| - | Postavlja se adresa instrukcije do koje se želi da Angr nađe put, ova adresa je adresa puts funkcije koja ispisuje " | + | Postavlja se adresa |
| 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: | ||
| </ | </ | ||
| - | 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 |
| - | Adresa instrukcije odmah nakon adrese instrukcije poziva | + | Adresa instrukcije odmah nakon adrese instrukcije poziva |
| < | < | ||
| Line 171: | Line 171: | ||
| </ | </ | ||
| - | kao što se vidi na slici 31 (MOV instrukcija, | + | kao što se vidi na slici iznad (MOV instrukcija, |
| < | < | ||
| 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 |
| 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 | + | 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 |
| < | < | ||
rev2_angr.1761926794.txt.gz · Last modified: 2025/12/01 11:40 (external edit)