This is an old revision of the document!
PRIMJER -Zadatak s Hacknite platforme - Slastičarna
Možete li kupiti tajni sastojak? Na online servis se možete spojiti naredbom nc chal.platforma.hacknite.hr 13016 ako koristite Linux ili telnet chal.platforma.hacknite.hr 13016 ako koristite Windows
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
String se koristi unutar funkcije fcn.000016f8 na adresi 0x17ef.
s fcn.000016f8
Vp
Ispis CFG-a klikom na tipku space ispisuje blokove i uvjete njihovih izvršavanja. Kako bi se uvjeti razumjeli, potrebno je poznavati instrukcije koje se koriste.
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 varijabli 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 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 od 0x37. U eax je učitana vrijednost s adrese 0x40c0. Dakle, potrebno je pronaći interakciju programa s tom adresom.
axt 0x40c0
Ispisane su 4 interakcije od koje su dvije iz funkcije u kojoj se trenutačno nalazimo. Jedno 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
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, eax i edx se 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 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 varijabla var_10h određena.
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 originalna funkcija fcn.000016f8 poziva.
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.




