User Tools

Site Tools


elemental_fighters

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
elemental_fighters [2025/10/31 15:09] mbunicelemental_fighters [2025/12/01 11:40] (current) – external edit 127.0.0.1
Line 1: Line 1:
 +==== Zadatak s Hacknite platforme - Elemental Fighters ====
 +
 +Uz zadatak je dan i izvorni kod.
 +
 +Spajanjem na zadatak otvara se izbor borca, mogući izbor su 3 borca i 3 elementa za svakog borca.
 +
 +{{ elemental_fighters:slika1.png?nolink&500 | Slika 1. - izbor borca}}
 +
 +Analizom koda u zadatku može se zaključiti da zapravo ne postoji kombinacija borca koja bi ni u najsretnijem slučaju uspjela pobijediti sve neprijatelje i doći do flaga, to znači da je potrebno nešto drugo učiniti jer ne postoji izbor pravog borca.
 +
 +Analizom koda zanimljiva je varijabla **s**, koja je "scale", odnosno određuje koliko će se oslabiti ili ojačati neprijatelje.
 +
 +{{ elemental_fighters:slika2.png?nolink&500 | Slika 2 - scale varijabla}}
 +
 +Ova varijabla se kasnije u kodu množi s atributima neprijatelja i što je manja, neprijatelji su slabiji, a što je veća, neprijatelji su jači.
 +
 +Također zanimljiv dio koda je player default, koji definira player varijablu kao **Milo("ice")**, ako je player None.
 +
 +{{ elemental_fighters:slika3.png?nolink&500 | Slika 3. - Player default}}
 +
 +Ključan dio koda je funkcija kojom se inicijalizira player varijabla iz izbora igrača.
 +
 +{{ elemental_fighters:slika4.png?nolink&500 | Slika 4. - inicijalizacija player varijable iz igračevog izbora}}
 +
 +Ovdje se može vidjeti da se koristi funkcija **eval**, kojime se fighter unos poziva kao funkcija, a fighterType kao argument.
 +
 +Može se vidjeti da su fighteri zapravo funkcije:
 +
 +{{ elemental_fighters:slika5.png?nolink&500 | Slika 5. - fighter funkcije}}
 +
 +a fighterType vrijednosti su definirane u rječniku, te se parsiraju pri pozivanju fighter funkcije.
 +
 +To znači da je unosom fighterType ("Odaberite element borca") zapravo se definira argument funkcije, a unosom fighter ("Odaberite borca") se definira funkcija kojoj će se argument proslijediti i koja će se izvršiti s proslijeđenim argumentom u **eval** funkciji.
 +
 +Svaki unos prolazi kroz validate_input funkciju, koja je filter koji određuje koji su unosi dozvoljeni, a koji nisu.
 +
 +{{ elemental_fighters:slika6.png?nolink&500 | Slika 6. - validate funkcija}}
 +
 +Kako bi provjerili da možemo pozvati proizvoljnu funkciju i argument, ako nemamo unos koji bi funkcija validacije zabranila, možemo probati pozvati:
 +
 +<file>
 +list("aaa")
 +</file>
 +
 +Odaberite element borca (Ice, Fire, Acid): aaaa  
 +Odaberite borca (Zorn, Krev, Milo)list
 +
 +{{ elemental_fighters:slika7.png?nolink&500 | Slika 7. - poziv list("aaa")}}
 +
 +Vidimo da je program vratio listu u kojoj se nalaze svi znakovi iz stringa koji smo poslali kao prvi argument, te oko njih znakovi za zagrade, koji su znakovi zagrada oko fighterType varijable (vidi sliku 4).
 +
 +Slično se može pozvati len funkcija.
 +
 +<file>
 +len("aaa")
 +</file>
 +
 +Poziva se na ovakav način.
 +
 +<file>
 +Odaberite element borca (Ice, Fire, Acid): aaa  
 +Odaberite borca (Zorn, Krev, Milo)len
 +</file>
 +
 +{{ elemental_fighters:slika8.png?nolink&500 | Slika 8. - poziv len("aaa")}}
 +
 +Vidimo da program vraća 5, što je točno 3 znakova a koje smo poslali plus dva znaka zagrada.
 +
 +Flag nije zapisan niti u jednoj varijabli, nego je samo hardkodiran u zadnjem printu programa, pa je potrebno osmisliti način kako pozvati odgovarajuću funkciju i argument, da bi se program uspješno izvršio do kraja i ispisao flag.
 +
 +Dobar pristup bi bio mijenjanje varijable **s** na slici 2, koja je skala jačine protivnika. Ako bi tu varijablu mogli smanjiti ili pretvoriti u 0, protivnici bi bili puno slabiji, dok činjenica da je unos potrošen na mijenjanje varijable **s** umjesto na inicijalizaciju našeg borca ne bi bio problem, jer postoji "default" odabir borca, ako borac nije definiran, prikazan na slici 3.
 +
 +Cijeli unos igrača se izvršava unutar funkcije **eval**, koja je namijenjena samo za evaluiranje **expression**-a, koji nakon izvršavanja vraća neku vrijednost, na primjer:
 +
 +<file>
 +"2+2"
 +</file>
 +
 +vraćena vrijednost je 4,  
 +
 +<file>
 +len("(aaa)")
 +</file>
 +
 +vraćena vrijednost je 5, i bilo koja vrijednost koja će biti vraćena nakon izvršavanja ekspresije u **eval** funkciji će biti pridružena varijabli **player** (vidi sliku 4).
 +
 +Potrebno je pronaći način kako mijenjati druge varijable u globalnom kontekstu programa, kao varijablu **s**, unutar **eval** funkcije, čiji se rezultat izvršavanja pridružuje varijabli **player**.
 +
 +Osim **expression** u Pythonu, koji izvršava izraz i vraća izračunatu vrijednost izraza, postoji i **statement**, koji izvršava definiranu akciju, no ne vraća ništa.
 +
 +Primjer **statement-a**
 +
 +<file>
 +a = 0
 +</file>
 +
 +, no pošto **statement** ne vraća ništa
 +
 +<file>
 +b = (a = 0)
 +</file>
 +
 +je neispravan Python kod, kao što bi bilo i da se eval koristio.
 +
 +<file>
 +eval("a = 0")
 +</file>
 +
 +(probajte u Python interpreteru).
 +
 +Slično funkciji **eval**, postoji funkcija **exec**, koja je upravo namijenjena za izvršavanje **statement** (a može izvršavati i **expression**), te može definirati ili mijenjati varijable u globalnom kontekstu programa, ako se također pokreće u globalnom kontekstu programa.
 +
 +<file>
 +exec("a=0")
 +</file>
 +
 +Pregledom funkcije za validaciju unosa na slici 6 vidi se da funkcija **exec** nije zabranjena.
 +
 +Znači da se funkcija **exec** može koristiti za mijenjanje vrijednosti scale varijable **s**, koja je globalna varijabla.
 +
 +Iz ovoga se može zaključiti da potencijalni način rješavanja ovog programa bi bio izvršiti:
 +
 +<file>
 +exec(s=0)
 +</file>
 +
 +Čime bi unos izgledao ovako:
 +
 +<file>
 +Odaberite element borca (Ice, Fire, Acid): s=0
 +Odaberite borca (Zorn, Krev, Milo)exec
 +</file>
 +
 +Pokretanjem ovog unosa, prikazanog na slici 9, pojavljuje se greška.
 +
 +{{ elemental_fighters:slika9.png?nolink&500 | Slika 9. - greška pri pokušaju}}
 +
 +Greška je invalid syntax, koju zapravo baca parser **eval** funkcije, koji pregledava kod prije nego će se izvršiti da odredi je li kod zapravo validan **expression**, iako je kod namijenjen da bude proslijeđen **exec** funkciji koja bi ovaj kod mogla normalno izvršiti.
 +
 +Opisana ponašanja su prikazana na slici 10.
 +
 +{{ elemental_fighters:slika10.png?nolink&500 | Slika 10. - eval parser i exec funkcija}}
 +
 +Na slici je prikazano da **eval** može izvršiti:
 +
 +<file>
 +a==3
 +</file>
 +
 +jer je to zapravo validan **expression** koji se evaluira u False.
 +
 Način kako se ovo može postići je korištenjem Pythonovog "walrus" operatora, koji je zapravo **expression**, vraća rezultat evaluacije **expressiona**, ali također evaluirani **expression**, nakon evaluacije postavlja kao vrijednost dane varijable. Način kako se ovo može postići je korištenjem Pythonovog "walrus" operatora, koji je zapravo **expression**, vraća rezultat evaluacije **expressiona**, ali također evaluirani **expression**, nakon evaluacije postavlja kao vrijednost dane varijable.
  
Line 5: Line 156:
 {{ elemental_fighters:slika11.png?nolink&500 | Slika 11. - walrus operator}} {{ elemental_fighters:slika11.png?nolink&500 | Slika 11. - walrus operator}}
  
-Na slici 11 može se vidjeti kako funkcionira walrus operator: evaluira **expression** "1 == 1", što je `True`, i to prosljeđuje kao rezultat **if statementu**, ali također tu istu vrijednost postavlja kao vrijednost varijable **a**.+Na slici 11 može se vidjeti kako funkcionira walrus operator: evaluira **expression** "1 == 1", što je `True`, i to prosljeđuje kao rezultat **if izrazu**, ali također tu istu vrijednost postavlja kao vrijednost varijable **a**.
  
-Walrus operatorom se može napisati validan **expression**, koji će nakon evaluacije također promijeniti vrijednost odabrane varijable, odnosno varijable **s**.+Walrus operatorom se može napisati validan **expression**, koji nakon evaluacije također mijenja vrijednost odabrane varijable, ciljano varijable **s**.
  
-No walrus operator se ne može sam izvršavati niti unutar **eval** niti unutar **exec** funkcije, zato što je namijenjen da bude izvršen unutar **expressiona**.+Walrus operator se ne može sam izvršavati niti unutar **eval** niti unutar **exec** funkcije, zato što je namijenjen da bude izvršen unutar **expressiona**.
  
 {{ elemental_fighters:slika12.png?nolink&500 | Slika 12 - walrus operator}} {{ elemental_fighters:slika12.png?nolink&500 | Slika 12 - walrus operator}}
Line 23: Line 174:
 {{ elemental_fighters:slika13.png?nolink&500 | Slika 13 - walrus operator unutar zagrada}} {{ elemental_fighters:slika13.png?nolink&500 | Slika 13 - walrus operator unutar zagrada}}
  
-Ovo je zapravo slučaj u kodu zadatka, zato što se oko unosa dodaju zagrade, što je prikazano na slici ispod.+Ovo je slučaj u kodu zadatka, zato što se oko unosa dodaju zagrade, što je prikazano na slici ispod.
  
 {{ elemental_fighters:slika14.png?nolink&500 | Slika 14 - zagrade oko korisničkog unosa}} {{ elemental_fighters:slika14.png?nolink&500 | Slika 14 - zagrade oko korisničkog unosa}}
Line 29: Line 180:
 Kada su zagrade oko unosa, unutar zagrada mora biti validan **expression**, što `s=0` nije nego je **statement**, kao što se vidi na slici ispod. Kada su zagrade oko unosa, unutar zagrada mora biti validan **expression**, što `s=0` nije nego je **statement**, kao što se vidi na slici ispod.
  
-{{ elemental_fighters:slika15.png?nolink&500 | Slika 15 - nevaljajuca sintaksa}}+{{ elemental_fighters:slika15.png?nolink&500 | Slika 15 - neispravna sintaksa}}
  
-Zato rješenje:+To čini ovaj pristup neizvedivim:
  
 <file> <file>
Line 38: Line 189:
 </file> </file>
  
-nije moguće. 
  
-Ali walrus operator je validan **expression** i namijenjen je za izvršavanje unutar **expressiona**, što se postiže stavljanjem zagrada. Ovako se walrus operator može izvršiti i unutar **eval** i unutar **exec** funkcije, gdje u oba slučaja uspješno mijenja vrijednost varijable (ali samo ako se **exec** i **eval** pokreću unutar globalnog konteksta).+"alrus operator je validan **expression** i namijenjen je za izvršavanje unutar **expressiona**, što se može napraviti stavljanjem dodatnih zagrada. Ovako se walrus operator može izvršiti i unutar **eval** i unutar **exec** funkcije, gdje u oba slučaja uspješno mijenja vrijednost varijable (ali samo ako se **exec** i **eval** pokreću unutar globalnog konteksta).
  
 {{ elemental_fighters:slika16.png?nolink&500 | Slika 16 - walrus i eval / exec}} {{ elemental_fighters:slika16.png?nolink&500 | Slika 16 - walrus i eval / exec}}
Line 62: Line 212:
 {{ elemental_fighters:slika20.png?nolink&500 | Slika 20 - pojednostavljeno izvršavanje payloada}} {{ elemental_fighters:slika20.png?nolink&500 | Slika 20 - pojednostavljeno izvršavanje payloada}}
  
-Sada je poznato rješenje i razlog zašto rješava zadatak.+Sada je poznato rješenje i način kako rješava zadatak.
  
 Rješenje se može unijeti ovako: Rješenje se može unijeti ovako:
Line 77: Line 227:
 ==== Eval / Exec i global scope ==== ==== Eval / Exec i global scope ====
  
-Pošto je ovo izvršeno u global scopeu, **exec** može promijeniti vrijednost scale varijable **s**, dok da se izvršavao unutar funkcije, ne bi mogao promijeniti niti local scope varijablu u istom scopeu kao funkcija.+Budući da je ovo izvršeno u global scopeu, **exec** može promijeniti vrijednost scale varijable **s**, dokda se izvršavao unutar funkcije, ne bi mogao promijeniti niti lokalnu varijablu unutar istog scopea kao funkcija.
  
 {{ elemental_fighters:slika22.png?nolink&500 | Slika 22. - eval unutar functiona}} {{ elemental_fighters:slika22.png?nolink&500 | Slika 22. - eval unutar functiona}}
Line 85: Line 235:
 {{ elemental_fighters:slika23.png?nolink&500 | Slika 23. - eval unutar global scopea}} {{ elemental_fighters:slika23.png?nolink&500 | Slika 23. - eval unutar global scopea}}
  
-Ovo vrijedi i za **eval** i za **exec**. +Ovo pravilo vrijedi i za **eval** i za **exec**, obje funkcije mogu mijenjati globalne varijable samo kada se izvršavaju u globalnom scopeu.
elemental_fighters.1761923342.txt.gz · Last modified: 2025/12/01 11:40 (external edit)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki