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/30 16:07] – mbunic | rev2_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 |
| + | |||
| + | |||
| + | 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, | 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 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 = claripy.BVS(" | ||
| Line 78: | 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 93: | Line 101: | ||
| Pokretanjem ove skripte, Angr nalazi rješenje zadatka. | Pokretanjem ove skripte, Angr nalazi rješenje zadatka. | ||
| - | {{ : | + | {{ rev2_angr: |
| - | Skripta | + | 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: | ||
| </ | </ | ||
| - | 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: |
| Line 115: | 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. | ||
| - | {{ : | + | {{ rev2_angr: |
| Line 132: | Line 140: | ||
| Se postavlja, jer strcspn funkcija čita iz memorije, no kada se koristi simbolično izvršavanje, | Se postavlja, jer strcspn funkcija čita iz memorije, no kada se koristi simbolično izvršavanje, | ||
| - | 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 |
| < | < | ||
| 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. | ||
| - | {{ : | + | {{ rev2_angr: |
| Line 155: | 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 163: | Line 171: | ||
| </ | </ | ||
| - | kao što se vidi na slici 31 (MOV instrukcija, | + | kao što se vidi na slici iznad (MOV instrukcija, |
| < | < | ||
| Line 182: | Line 190: | ||
| Argumenti hook funkcije su isti kao i u prethodnom objašnjenju, | Argumenti hook funkcije su isti kao i u prethodnom objašnjenju, | ||
| - | {{ : | + | {{ rev2_angr: |
| 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 |
| 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. | ||
| - | {{ : | + | {{ rev2_angr: |
| 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 | + | 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.1761840471.txt.gz · Last modified: 2025/12/01 11:40 (external edit)