==== Radare2 ==== //Radare2// je reversing CLI (Command LIne Interface) alat koji se koristi za disasemblanje, dekompajliranje, kreiranje CFG-ova (Control Flow Graph) i sl. Pokreće se naredbom : > r2 naziv_datoteke Radare2 nudi velik broj funkcionalnosti u kojima se ponekad teško snaći. Kako bi se ispisale naredbe koje se mogu koristiti, može se upisati naredba "?" ili jednostavnije pritiskom tipke TAB. Ako je potrebno ispisati više detalja o nekoj naredbi, upiše se njegov prefiks i simbol "?" ili se pritisne TAB. Npr., za više informacija o naredbi "a", upiše se "a?" ili "a" + TAB. Ispis dokumentacije je rekurzivan, npr. podnaredba "aa" također ima svoju dokumentaciju. Kako se bi se analizirala neka datoteka (pronašle funkcije, xref-ovi, CFG i sl.), potrebno je pokrenuti naredbu "aaa". Ako je analiza uspješno izvršena, mogu se ispisati sve funkcije pomoću naredbe "afl". Ako datoteka nije stripped, 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 "ie". U komandnoj liniji lijevo od unosa nalazi se trenutačna adresa seek kursor. Seek kursor je kursor koji pokazuje na kojoj poziciji u programu se trenutačno //radare2// nalazi. Neke funkcije poput disasembliranja ne primaju argument, već disasembliraju od pozicije na kojoj se program trenutačno nalazi. Naredba za disasembliranje jest "pdf". Kada bi se htio dobiti disasembl main funkcije, treba postaviti seek kursor na adresu maina, naredbom "s main" i zatim "pdf". Naredbom "pdf @ main" //radare2// najprije postavi kursor na adresu maina, zatim izvrši 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 u kojemu je cilj upisati ispravnu lozinku te se pri upisu lozinke korisniku predstavi sljedeći string: "Molimo unesite lozinku: ". Naredbom "iz", ispisuju se svi stringovi unutar datoteke. Pojavit će se njen ispis i adresu na kojoj se nalazi, osim ako navedeni string nije konstruiran statički, prilikom pisanja programa, već dinamički, tijekom rada programa. Jednom kada je poznata adresa stringa, naredbom "axt " (gdje je "t" unutar "axt" skraćeno za "to" (engl. To = hrv. prema) ispisuje koje sve adrese/funkcije se referenciraju na tu adresu, tj. koriste ju. Tako je naprimjer lako pronaći funkciju koja prima unos lozinke. Ako bismo zatim htjeli ispisati sve cross reference koje ta funkcija koristi (recimo druge stringove, funkcije ili podatke) može se iskoristiti funkcija "axf" (gdje f znači "from"). Program //radare2// nudi vizualni ispis programa naredbom "V" čime je ispisan raw dump bajtova programa. Ako smo postavili seek na adresu neke funkcije, dani panel se može izmijeniti na interpretaciju instrukcija klikom gumba "p" (gdje je "shift+p" povratak na prethodnu interpretaciju). Automatsko disasembliranje instrukcija je korisno za brzo snalaženje u programu. 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 "kretanje" kroz ispis mogu se koristiti strelice gore/dolje. __**mislim da tu treba neka slika koja ilustrira o čemu se govori**__ Ako program ima puno uvjetnih skokova (engl. jump), dakle koji se izvršavaju kad je ispunjen neki uvjet, može se koristiti CFG pritiskom na tipku "space" jednom kada je interpretacija postavljena na te instrukcije. CFG je vizualni graf u kojem je svaki čvor dio koda koji je neprekinut skokovima. Međusobno su povezani linijama "t" ili "f", gdje linija "t" predstavlja da je uvjet ispunjen ("true"), a linija "f" ("false") da nije ispunjen. Postoji i linija "v" koja predstavlja bezuvjetni skok. Prolaskom kroz CFG lako je vidjeti koji uvjeti moraju biti ispunjeni da bi se blok izvršio (npr. ispis datoteke flag.txt). //Radare2// je jako širok framework s velikim brojem funkcionalnosti. Više se može pročitati [[https://book.rada.re/intro/intro.html|ovdje]]. ==== Primjer - Zadatak s Hacknite platforme - Slastičarnica ==== 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//. > r2 slasticarna_prod > aaa > iz Naredba "iz" pokazuje ispis svih stringova te je jedan od njih "flag.txt" na adresi 0x000020ed. > axt 0x20ed {{axt.png}} String se koristi unutar funkcije fcn.000016f8 na adresi 0x17ef. > s fcn.000016f8 > Vp Ispis CFG-a pritiskom na tipku "space" ispisuje blokove i uvjete njihovih izvršavanja. Kako bi se uvjeti razumjeli, potrebno je poznavati instrukcije koje se koriste. {{prviblok.png}} {{drugiblok.png}} Vidljivo je da se flag ispisuje ako blok na 0x17c8 nema ispunjen uvjet te blok na 0x17d4 također nema ispunjen uvjet. Uvjet koji mora biti ispunjen u bloku 0x17c8 jest "cmp eax, 0x13". Eax je jednak vrijednost varijable "var_7ch" koja je u prethodnom bloku bila postavljena na vrijednost 0. Kako uvjet ne bi bio ispunjen, eax mora biti veći od 0x13. Pregledom druge grane (gdje je ispunjen uvjet), vidljivo je da se radi o petlji (enlg. loop) 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 od 0x37. U eax je učitana vrijednost s adrese 0x40c0. Dakle, potrebno je pronaći interakciju programa s tom adresom. > axt 0x40c0 {{axt2.png}} 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. > s 0x1570 > pdf {{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. 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, zatim se eax i edx zbroje te se vrijednost pospremi ponovno na adresu 0x40c0. Dakle, vrijednost na adresi 0x40c0 je uvijek rastuća te se resetira samo na izlazu iz funkcije fcn.00001400. Vrijednost unutar "var_10h" koristi se za indeksiranje polja koje se nalazi na 0x404a (pretpostavka je da 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 određena vrijednost varijable "var_10h". {{odaberi.png}} Iz disasemblija je vidljivo da je to indeks koji korisnik unese pri upitu "Odaberi sastojak: ". > 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 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 poziva originalna funkcija fcn.000016f8 . > axt fcn.00001400 > pdf @ 0x12ef Kada korisnik odabere akciju "kupi" (akcija 3). 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 "kupi".