User Tools

Site Tools


blagajna

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
blagajna [2025/02/11 14:19] lssblagajna [2025/12/01 11:40] (current) – external edit 127.0.0.1
Line 2: Line 2:
  
 <file> <file>
-Postoje glasine da jedan proizvođač online blagajni ima backdoor u programu koji dopušta napadaču da dobije shell na serveru na kojem se blagajna pokreće. Možeš li ga otkriti i iskoristiti da pročitaš flag?+Postoje glasine da jedan proizvođač online blagajni ima backdoor u programu koji dopušta napadaču  
 +da dobije shell na serveru na kojem se blagajna pokreće. Možeš li ga otkriti i iskoristiti da pročitaš flag?
  
-Na online servis se možeš spojiti naredbom nc chal.platforma.hacknite.hr 13015 ako koristite Linux ili telnet chal.platforma.hacknite.hr 13015 ako koristite Windows+Na online servis se možeš spojiti naredbom
 +  nc chal.platforma.hacknite.hr 13015 ako koristite Linux ili  
 +  telnet chal.platforma.hacknite.hr 13015 ako koristite Windows.
  
 Hint: Global Offset Table . Entry za exit funkciju Hint: Global Offset Table . Entry za exit funkciju
 </file> </file>
  
-Ovo je reversing zadatak u kojemu je potrebno pronaći način za pokretanje shella. Program korišten za reversing je Ghidra.+Ovo je reversing zadatak u kojem treba naći način za pokretanje shella. Program korišten za reversing je Ghidra.
  
-Pokretanjem programa korisnika se pita za unos opcije 1-4. +Pokretanjem programakorisnika se pita za unos opcije 1 do 4. 
  
 {{blagajna:slika1.png}} {{blagajna:slika1.png}}
  
-Ponuđene opcije su prijava blagajnika, ispis podataka o programu, početak unosa stavki te izlaz.+Ponuđene opcije suprijava blagajnika, ispis podataka o programu, početak unosa stavki te izlaz.
  
 Prijava blagajnika uključuje unos naziva blagajnika te broj zaposlenika. Prijava blagajnika uključuje unos naziva blagajnika te broj zaposlenika.
Line 31: Line 34:
 Zadnja opcija jest izlaz iz programa.  Zadnja opcija jest izlaz iz programa. 
  
-Kako bi se riješio zadatak najprije je potrebno dekompajlirati kod pomoću ghidre i zatim pregledati dobivene funkcije.+Kako bi se riješio zadataknajprije je potrebno dekompajlirati kôd pomoću //ghidre// i zatim pregledati dobivene funkcije.
  
-Postavljenjem unutar main funkcije može se pronaći glavni switch odgovoran za loop unosa opcija.+Postavljenjem unutar main funkcije može se pronaći glavni switch odgovoran za petlju unosa opcija.
  
 {{blagajna:slika5.png}} {{blagajna:slika5.png}}
  
-Svaka opcija poziva svoju zasebnu funkciju. Funkcija za opciju jedan jest prikazana na sljedećoj slici.+Svaka opcija poziva svoju zasebnu funkciju. Funkcija za opciju jedan je prikazana na sljedećoj slici.
  
 {{blagajna:slika6.png}} {{blagajna:slika6.png}}
  
-Buffer u koji se upisuju podaci jest dan kao argument param1. Naziv blagajnika unosi se u prvih 0x32 bajta, a na offsetu 0x38 od njegovog početka se unosi long  +Spremnik (engl. Bufferu koji se upisuju podaci je dan kao argument "param1". Naziv blagajnika unosi se u prvih 0x32 bajta, a na offsetu 0x38 od njegovog početka se unosi varijabla tipa long koja predstavlja broj zaposlenika.
-koji predstavlja broj zaposlenika.+
  
 Funkcija za opciju 2 je prikazana na sljedećoj slici. Funkcija za opciju 2 je prikazana na sljedećoj slici.
Line 48: Line 50:
 {{blagajna:slika7.png}} {{blagajna:slika7.png}}
  
-Iako je funkcionalnost za vrijeme izvođenja programa naizgled bila samo ispis teksta, analizom funkcije vidi se if statement koji pregledava je li broj na offsetu 38  +Iako je funkcionalnost za vrijeme izvođenja programa naizgled bila samo ispis teksta, analizom funkcije vidi se naredba "if" koja pregledava je li broj na offsetu 38 prvog parametra veći od 100 teako jese od adrese 0x404060 indeksira parametrom "param2te upisuje podatak koji se nalazi na offsetu 38 prvog parametra. Pregledom main 
-prvog parametra veći od 100 te ako je se od adrese 0x404060 indeksira parametrom param2 te upisuje podatak koji se nalazi na offsetu 38 prvog parametra. Prvi pregledom main +funkcije vidimo da je prvi parametar koji je proslijeđen ovoj funkciji isti kao i u prethodnoj, odnosno, upisuje se broj zaposlenika. 
-funkcije prvi parametar koji je proslijeđen ovoj funkciji je isti kao i u prethodnoj, odnosno, upisuje se broj zaposlenika. +Adresa 0x404060 pripada .got sekciji. To je sekcija koja sadrži pointere na funkcije dinamički povezanih datoteka, u ovom slučaju libc. Napadi uobičajeno, izmjenom nekih od podataka zapisanih u .got sekciji, promijene predviđeni tok programa. S obzirom na to da je cilj zadatka pokrenuti shell, očito je da se tok nekako mora izmijeniti u 
-Adresa 0x404060 pripada .got sekciji. To je sekcija koja sadrži pointere na funkcije dinamički povezanih datoteka, u ovom slučaju libc. Izmjenjivanjem neki od podataka +
-zapisanih u .got sekciji je uobičajen način izmjenjivanja predviđenog toka programa. S obzirom na to da je cilj zadatka podići shell, očito je da se tok nekako mora izmijeniti u +
 poziv system funkcije s argumentom za shell. poziv system funkcije s argumentom za shell.
-Jedino što je preostalo jest otkriti koji podatak je drugi parametar funkcije za ispis podataka o programu. Pregledom main funkcije argument kojim se poziva funkcija za ispis +Jedino što je preostalo jest otkriti koji podatak je drugi parametar funkcije za ispis podataka o programu. Pregledom main funkcije argument kojim se poziva funkcija za ispis ima naziv "local_b0(sam naziv može varirati od analize do analize, bitno je da se prati gdje se ta varijabla koristi). Pregledom ostatka funkcije main može se pronaći 
-ima naziv local_b0 (sami naziv može varirati od analize do analize, bitno je da se prati gdje se ta varijabla koristi). Pregledom ostatka funkcije main može se pronaći +odsječak kôda kojim se upisuje u tu varijablu.
-odsječak koda kojim se upisuje u tu varijablu.+
  
 {{blagajna:slika8.png}} {{blagajna:slika8.png}}
  
-Kod kojim se upisuje u varijablu jest dio 3. opcije unutar glavnog loopa odgovoran za unos broja stavki. Praćenjem toka programa vidi se da se nakon toga upisa nigdje drugdje +Kôd kojim se upisuje u varijablu jest dio 3. opcije unutar glavne petlje odgovorne za unos broja stavki. Praćenjem toka programa vidi se da se nakon toga upisa nigdje drugdje ne izmijeni vrijednost unutar te varijable (unutar iste iteracije). 
-ne izmijenjuje vrijednost unutar te varijable (unutar iste iteracije). +Dakle, kada bi se unutar broja stavki upisala ispravna vrijednost, njome se mogu proizvoljno indeksirati adrese krečući od 0x404060 (s razmacima od 8 bajta) te upisati vrijednost broja zaposlenika na dobivenu adresu.  
-Dakle, kada bi se unutar broja stavki upisala ispravna vrijednost, njome se mogu proizvoljno indeksirati adrese krečući od 0x404060 (s razmacima od 8 bajta) +Kako bi se pokrenuo shell, treba upisati takvu vrijednost adrese kojom se poziva system funkcija na neku od dostupnih dinamičkih funkcija (tj. one koje se koriste u normalnom toku programa), te kao prvi argument imati vrijednost adrese stringa kojom se pokreče shell. Uobičajeni argument kojim se pokreće shell jest "/bin/sh".
-te upisati vrijednost broja zaposlenika na dobivenu adresu.  +
-Kako bi se podigao shell, potrebno je upisati vrijednost adrese kojom se poziva system funkcija na neku od dostupnih dinamičkih funkcija (tj. one koje se koriste u normalnom +
-toku programa), te kao prvi argument imati vrijednost adrese stringa kojom se podiže shell. Uobičajeni argument kojim se podiže shell jest "/bin/sh".+
  
-Dakle, koraci potrebni za podizanje shella su:+Dakle, koraci potrebni za pokretanje shella su:
  
-  -Upisati adresu system funkcije u broj zaposlenika. To može biti vrijednost unutar .plt sekcije ili adresa unutar libc sekcije.Pošto je za unos adrese iz libc sekcije potreban nekakava vrsta leaka njene adrese (koji nije dostupan) upisivat će se adresa iz .plt. Vrijednost adrese system iz .plt sekcije jest 0x401070 odnosno 4198512. +  -Upisati adresu system funkcije u broj zaposlenika. To može biti vrijednost unutar .plt sekcije ili adresa unutar libc sekcije. Pošto je za unos adrese iz libc sekcije potrebna nekakava vrsta leaka njene adrese (koji nije dostupan) upisivat će se adresa iz .plt. Vrijednost adrese system iz .plt sekcije jest 0x401070 odnosno 4198512. 
-  -Unijeti broj stavki za indeksiranje od adrese 0x404060. Ako se kao broj stavki unese 0, vrijednost će biti zapisana na 0x404060. Ako je uneseno 1, vrijednost će biti zapisana na 0x404060 + 1 * 8 (pointer aritmetika). Zbog funkcije koja se koristi za učitavanje. Na izračunatoj adresi se mora nalaziti funkcija koja se poziva unutar normalnog toka programa, te se ne smije pozivati prije završetka idućeg koraka (još je potrebno unijeti adresu stringa za shell) kako ne bi došlo do greške u izvođenju te izlaza iz programa. Funkcija koja će se prepisivati jest exit upravo iz tog razloga. Indeks potreban za exit jest adresa exit-a unutar .got sekcije oduzeto sa 0x404060 te sve podijeljeno s 8, tj. (0x404070-0x404060)/8 što je jednako vrijednosti 2. Funkcija exit se poziva odabirom opcije 4. Također, pregledom main funkcije vidljivo je da se ta funkcija poziva s argumentom local_b0 što je broj stavki što znači da će postavljanje argumenta biti napravljeno ponovnim upisom broja stavki.\\ {{blagajna:slika9.png}} +  -Unijeti broj stavki za indeksiranje od adrese 0x404060. Ako se kao broj stavki unese 0, vrijednost će biti zapisana na 0x404060. Ako je uneseno 1, vrijednost će biti zapisana na 0x404060 + 1 * 8 (pointer aritmetika). Zbog funkcije koja se koristi za učitavanje. Na izračunatoj adresi se mora nalaziti funkcija koja se poziva unutar normalnog toka programa, te se ne smije pozivati prije završetka idućeg koraka (još je potrebno unijeti adresu stringa za shell) kako ne bi došlo do greške u izvođenju te izlaza iz programa. Funkcija koja će se prepisivati jest exit upravo iz tog razloga. Indeks potreban za exit jest adresa exit-a unutar .got sekcije oduzeto sa 0x404060 te sve podijeljeno s 8, tj. (0x404070-0x404060)/8 što je jednako vrijednosti 2. Funkcija exit se poziva odabirom opcije 4. Također, pregledom main funkcije vidljivo je da se ta funkcija poziva s argumentom "local_b0što je broj stavkišto znači da će postavljanje argumenta biti napravljeno ponovnim upisom broja stavki.\\ {{blagajna:slika9.png}} 
-  -Unos argumenta za podizanje shella. Argument kojim se podiže shell može biti "/bin/sh", "sh", "/bin/bash" i slične varijacije. Grepanjem stringa unutar programa za "sh" ispisuje adresu 0x004022a3 koji je dio teksta Gotovina/Cash. +  -Unos argumenta za pokretanje shella. Argument kojim se pokreće shell može biti "/bin/sh", "sh", "/bin/bash" i slične varijacije. Traženjem (grep) stringa unutar programa za "sh" ispisuje adresu 0x004022a3 koji je dio teksta Gotovina/Cash. 
  
-Dakle, cijeli proces pokretanja shella jest unos opcije 1 s brojem zaposlenika postavljenim na 0x401070, unošenje vrijednost 2 za broj stavki unutar opcije 3, ispis +Dakle, cijeli proces pokretanja shella jest unos opcije 1 s brojem zaposlenika postavljenim na 0x401070, unošenje vrijednost 2 za broj stavki unutar opcije 3, ispis podataka o programu kako bi se izmijenila adresa unutar got-a za funkciju exit, ponovni upis broja stavki, ali s vrijednošću 0x004022a3 (tj. 4203171) te na kraju pozivanje opcije 4 
-podataka o programu kako bi se izmijenila adresa unutar got-a za funkciju exit, ponovni upis broja stavki, ali s vrijednošću 0x004022a3 (tj. 4203171) te na kraju pozivanje opcije 4 +za završetak programa.
-za završetka programa.+
  
 {{blagajna:slika10.png}} {{blagajna:slika10.png}}
blagajna.1739283565.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki