radare2_practical
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| radare2_practical [2025/01/28 03:45] – kresimir | radare2_practical [2025/12/01 11:40] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ==== Radare2 ==== | ==== Radare2 ==== | ||
| - | Radare2 je reversing CLI alat koji se koristi za disasemblanje, | + | //Radare2// je reversing CLI (Command LIne Interface) |
| Pokreće se naredbom : > r2 naziv_datoteke | Pokreće se naredbom : > r2 naziv_datoteke | ||
| - | Radare2 nudi velik broj funkcionalnosti u kojima | + | Radare2 nudi velik broj funkcionalnosti u kojima |
| - | koristiti, može se upisati naredba "?" | + | koristiti, može se upisati naredba "?" |
| - | upiše | + | |
| - | tu funkcionalnost. Ispis dokumentacije je rekurzivan, npr. podnaredba " | + | |
| - | Kako se bi se datoteka | + | Kako se bi se analizirala |
| Ako je analiza uspješno izvršena, mogu se ispisati sve funkcije pomoću naredbe " | Ako je analiza uspješno izvršena, mogu se ispisati sve funkcije pomoću naredbe " | ||
| - | vrlo često će se pojaviti funkcija main ili sym.main u ispisu što olakšava reversing. Ponekad, ako je stripped, potrebno | + | vrlo često će se pojaviti funkcija main ili sym.main u ispisu što olakšava reversing. Ponekad, ako je stripped, potrebno je doći do nje praćenjem toka programa. Za pronalazak osnovnog entry point-a datoteke, koristi se naredba " |
| - | je doći do nje praćenjem toka programa. Za pronalazak osnovnog entry point-a datoteke, koristi se naredba " | + | |
| U komandnoj liniji lijevo od unosa nalazi se trenutačna adresa seek kursor. Seek kursor je kursor koji pokazuje | U komandnoj liniji lijevo od unosa nalazi se trenutačna adresa seek kursor. Seek kursor je kursor koji pokazuje | ||
| - | na kojoj poziciji u program | + | na kojoj poziciji u programu |
| - | trenutačnu poziciju | + | Naredbom |
| - | je promijeniti | + | |
| - | mijenjanja adrese kursora samo za sljedeću naredbu uz pomoć simbola @. Npr. "pdf @ main" najprije | + | |
| - | naredbu pdf i na kraju vraća kursor na prvobitnu adresu. | + | |
| - | Za snalaženje u programu vrlo često se koriste xref-ovi (cross reference). Preko njih je lakše snalaziti se u asembliju. Recimo da se reversa zadatak | + | Za snalaženje u programu vrlo često se koriste xref-ovi (cross reference). Preko njih je lakše snalaziti se u asembliju. Recimo da se reversa zadatak u kojemu je cilj upisati ispravnu lozinku te se pri upisu lozinke korisniku predstavi sljedeći string: " |
| - | u kojemu je cilj upisati ispravnu lozinku te se na pri upisu lozinke korisniku predstavi sljedeći string: " | + | Naredbom " |
| - | ispisuju se svi stringovi unutar datoteke. | + | Jednom kada je poznata adresa stringa, naredbom "axt " (gdje je "t" |
| - | Jednom kada je poznata adresa stringa, naredbom "axt " (gdje je t unutar " | + | Tako je naprimjer lako pronaći funkciju koja prima unos lozinke. |
| - | referenciraju na tu adresu | + | Ako bismo zatim htjeli |
| - | koje ta funkcija koristi (recimo druge stringove, funkcije ili podatke) može se iskoristiti funkcija " | + | |
| - | Ponekad upis svih naredbi može biti redundantan zbog čega radare2 nudi vizualni ispis programa naredbom " | + | Program //radare2// nudi vizualni ispis programa naredbom " |
| - | na adresu neke funkcije, dani panel se može izmijeniti na interpretaciju instrukcija klikom gumba p (gdje je shift+p povratak na prethodnu interpretaciju). | + | Lijevo se nalaze cross reference (jumpovi i sl.), a desno komentari koje je //radare2// nadodao (npr. ispis stringa koji je učitan u neki registar). Za " |
| - | instrukcija | + | |
| - | je učitan u neki registar). Za " | + | |
| - | Ako program ima puno jumpova | + | __**mislim da tu treba neka slika koja ilustrira o čemu se govori**__ |
| - | CFG jest vizualni graf u kojem je svaki čvor dio koda koji je neprekinut skokovima | + | |
| - | ispunjen (" | + | Ako program ima puno uvjetnih skokova (engl. jump), dakle koji se izvršavaju |
| + | CFG je vizualni graf u kojem je svaki čvor dio koda koji je neprekinut skokovima. Međusobno | ||
| da bi se blok izvršio (npr. ispis datoteke flag.txt). | da bi se blok izvršio (npr. ispis datoteke flag.txt). | ||
| - | Radare2 je jako širok framework s velikim | + | //Radare2// je jako širok framework s velikim |
| - | ==== Primjer - Zadatal | + | ==== Primjer - Zadatak |
| Korisniku je predstavljen ispis bez puno konteksta. Nude mu se četiri opcije: (1) Dodaj (2) Ukloni (3) Kupi (4) Zavrsi. | Korisniku je predstavljen ispis bez puno konteksta. Nude mu se četiri opcije: (1) Dodaj (2) Ukloni (3) Kupi (4) Zavrsi. | ||
| - | Zadatak će biti riješen ručnim reversingom uz pomoć radare2. | + | Zadatak će biti riješen ručnim reversingom uz pomoć |
| > r2 slasticarna_prod | > r2 slasticarna_prod | ||
| Line 49: | Line 41: | ||
| > iz | > iz | ||
| - | Naredba iz pokazuje ispis svih stringova te je jedan od njih " | + | Naredba |
| > axt 0x20ed | > axt 0x20ed | ||
| Line 60: | Line 52: | ||
| > Vp | > Vp | ||
| - | Ispis CFG-a klikom | + | Ispis CFG-a pritiskom |
| - | je poznavati instrukcije koje se koriste. | + | |
| {{prviblok.png}} | {{prviblok.png}} | ||
| {{drugiblok.png}} | {{drugiblok.png}} | ||
| - | Vidljivo je da se flag ispisuje ako blok na 0x17c8 nema ispunjen uvjet te blok | + | Vidljivo je da se flag ispisuje ako blok na 0x17c8 nema ispunjen uvjet te blok na 0x17d4 također nema ispunjen uvjet. |
| - | na 0x17d4 također nema ispunjen uvjet. Uvjet koji mora biti ispunjen u bloku 0x17c8 jest "cmp eax, 0x13". Eax je jednak | + | Uvjet koji mora biti ispunjen u bloku 0x17c8 jest "cmp eax, 0x13". Eax je jednak |
| - | vrijednost | + | vrijednost |
| - | eax mora biti veći od 0x13. Pregledom druge grane (gdje je ispunjen uvjet), vidljivo je da se radi o loopu te je u bloku | + | |
| - | 0x17c4 vrijednost varijable var_7ch inkrementirana. To znači da će se false grana uvijek izvršiti nakon 20. iteracije. | + | |
| - | Blok 0x17d4 uspoređuje najniža 2 bajta rax registra (ax) s vrijednošću 0x37. Uvjet neće biti ispunjen ako je vrijednost veća | + | Blok 0x17d4 uspoređuje najniža 2 bajta rax registra (ax) s vrijednošću 0x37. Uvjet neće biti ispunjen ako je vrijednost veća od 0x37. U eax je učitana vrijednost s adrese 0x40c0. Dakle, potrebno je pronaći interakciju programa s tom adresom. |
| - | od 0x37. U eax je učitana vrijednost s adrese 0x40c0. Dakle, potrebno je pronaći interakciju programa s tom adresom. | + | |
| > axt 0x40c0 | > axt 0x40c0 | ||
| Line 79: | Line 67: | ||
| {{axt2.png}} | {{axt2.png}} | ||
| - | Ispisane su 4 interakcije od koje su dvije iz funkcije u kojoj se trenutačno nalazimo. Jedno postavljanje eax registra kao što | + | Ispisane su 4 interakcije od kojih su dvije iz funkcije u kojoj se trenutačno nalazimo. Jedno je postavljanje eax registra kao što je prethodno navedeno, a drugo je postavljanje vrijednosti na adresi 0x40c0 na vrijednost 0 pri izlazu iz funkcije (dakle ono nas ne zanima). Druge dvije interakcije se nalaze unutar funkcije fcn.00001400 na adresama 0x1570 i 0x1579. |
| - | je prethodno navedeno, a drugo je postavljanje vrijednosti na adresi 0x40c0 na vrijednost 0 pri izlazu iz funkcije (dakle ono | + | |
| - | nas ne zanima). Druge dvije interakcije se nalaze unutar funkcije fcn.00001400 na adresama 0x1570 i 0x1579. | + | |
| > s 0x1570 | > s 0x1570 | ||
| Line 88: | Line 74: | ||
| {{pdf.png}} | {{pdf.png}} | ||
| - | U eax je učitana vrijednost varijable var_10h. Zatim je učitana u rdx i međusobno je nad njima izvedena neka aritmetika. | + | U eax je učitana vrijednost varijable |
| Zatim se vrijednost posprema u rdx, a u rax je učitana adresa 0x404a. U edx se učita vrijednost [rdx + rax]. | Zatim se vrijednost posprema u rdx, a u rax je učitana adresa 0x404a. U edx se učita vrijednost [rdx + rax]. | ||
| - | U eax se učita vrijednost na adresi 0x40c0, eax i edx se zbroje te se vrijednost pospremi ponovno na adresu 0x40c0. | + | U eax se učita vrijednost na adresi 0x40c0, |
| Dakle, vrijednost na adresi 0x40c0 je uvijek rastuća te se resetira samo na izlazu | Dakle, vrijednost na adresi 0x40c0 je uvijek rastuća te se resetira samo na izlazu | ||
| - | iz funkcije fcn.00001400. Vrijednost unutar var_10h koristi za indeksiranje polja koje se nalazi na 0x404a (pretpostavka je da | + | iz funkcije fcn.00001400. Vrijednost unutar |
| - | se aritmetika izvodi kako bi se izvela veličina tipa * indeks). Dohvaćena vrijednost se nadoda na vrijednost na adresi 0x40c0 te | + | |
| - | se ponovno tamo pohrani. | + | |
| - | Sljedeći korak jest saznati kako je varijabla var_10h | + | Sljedeći korak jest saznati kako je određena |
| {{odaberi.png}} | {{odaberi.png}} | ||
| Line 105: | Line 89: | ||
| > x 0x404a | > x 0x404a | ||
| - | Dan je ispis sastojaka i njihova cijena. Pretpostavimo da je vrijednost var_10h jednaka 1. Ako pratimo izvođenje aritmetike nad vrijednosti var_10h vidjet ćemo | + | Dan je ispis sastojaka i njihova cijena. Pretpostavimo da je vrijednost |
| - | da se rax zbroji sa samim sobom i njegova vrijednost je 2. Zatim se doda vrijednost rdx (koja je također 1) | + | |
| - | i rezultat je 3. Ta vrijednost se bit shifta za 2 mjesta te je rezultat 12. Vrijednost na adresi 0x404a + 12 odgovara vrijednosti 5 što je cijena soli (kada | + | |
| - | se korisnika pita za id sastojka, on bude dekrementiran za 1 na adresi 0x14b2, dakle uneseni id 2 će vratiti cijenu soli). | + | |
| - | Sve što je preostalo jest saznati kako se originalna funkcija fcn.000016f8 | + | Sve što je preostalo jest saznati kako se poziva |
| > axt fcn.00001400 | > axt fcn.00001400 | ||
| > pdf @ 0x12ef | > pdf @ 0x12ef | ||
| - | Kada korisnik odabere akciju kupi (akcija 3). | + | Kada korisnik odabere akciju |
| - | Zaključak je taj da kako bi se ispisao flag, korisnik mora unijeti sastojke tako da im zbroj cijena bude veći od 55 (uklanjanjem sastojaka taj zbroj se ne | + | Zaključak je taj da kako bi se ispisao flag, korisnik mora unijeti sastojke tako da im zbroj cijena bude veći od 55 (uklanjanjem sastojaka taj zbroj se ne smanjuje) te odabrati akciju |
| - | smanjuje) te odabrati akciju kupi. | + | |
radare2_practical.1738035925.txt.gz · Last modified: 2025/12/01 11:40 (external edit)