Zadanie

Ak máte akékoľvek otázky ohľadom tejto úlohy, napíšte Prefixovi na [email protected]

Táto úloha nadväzuje na úlohu A tak sa Denis stratil z prechádzajúceho kola. Pri riešení tejto úlohy preto môžete využívať vzorové riešnie z minula.

Podarilo sa vám dostať k poslednému kódu. Zapísali ste ho do súboru spolu s ostatnými kódmi. Zrazu ste začuli hlasné vžuuu a Denis sa z čista jasna vynoril z počítača. Predsa len sa vám podarilo zachrániť ho. Denis vám celý nadšený poďakoval a rýchlo bežal1 po Prefixa. Niečo takéto mu predsa musí ukázať. Prefix je totižto skúsený hackerman a tento program ho bude isto zaujímať.

Denis postupne porozprával celý príbeh Prefixovi. Prefix, vzhľadom na svoju expertízu, Denisovi neveril. Ako by sa predsa mohol niekto stratiť v príkazovom riadku? Nemožné. Rozhodol sa, že sa na daný program musí pozrieť osobne. Predsa len, taký skúsený hackerman ako on rozlúskne, čo sa stalo. Veď je výrazne skúsenejší a nespraví rovnaké chyby ako Denis. Prefix príde k počítaču a spustí daný program ako správca. Vžuuuuuuuu.

Vašou úlohou je tentokrát zachrániť Prefixa. Keďže Prefix je skúsený hackerman, príkazový riadok si ho bude brániť výrazne viac ako Denisa. Prefix je v počítači roztrúsený v podobe kódov, ktoré sa nachádzajú v jednotlivých úlohách. Každý kód vyzerá ako spleť znakov a čísel, napr. d003f58b96e6b0a543bf75.

“Ale ja sa neviem orientovať v príkazovom riadku, ako ho tam mám nájsť?” hovoríš si. Žiaden problém! Všetko potrebné na začiatok nájdeš v predchádzajúcej úlohe.

“To som si už predsa pozrel, táto úloha sa mi ale zdá ťažšia. Ako ho mám teda nájsť?”. Opäť raz si budeš musieť veľa vecí vygoogliť, no čo by si pre zmenu nespravil/a pre Prefixa?

Úloha

V tejto úlohe budete musieť vykonávať, podobne ako v úlohe, kde ste zachraňovali Denisa, rôzne podúlohy v príkazovom riadku Linuxu. Tento systém nebude bežať u vás – dostanete sa doň pomocou návodu, ktorý sme pre vás spísali. Takže sa nebojte, nemusíte si nainštalovať Linux.

V prípade, že si neviete rady, Google je váš kamarát. Pokiaľ viete, môžete skúsiť hľadať po anglicky. Väčšinou dostanete viac výsledkov, ktoré budú často aj presnejšie.

Či ste vyriešili príklad zistíte tak, že sa dostanete ku kódu, ktorý môže vyzerať napríklad takto d003f58b96e6b0a543bf75. Tieto kódy budete na konci odovzdávať v popise. Požadujeme od vás aj krátky popis toho, ako ste príklad riešili. Nepripravili sme pre vás žiadne chytáky, takže keď už sa v príklade dostanete k niečomu, čo vyzerá ako kód, skoro určite je správny a dostanete bod.


  1. Autor navádza na akútnosť rozhodnutia, keďže Denis len tak pre nič za nič nebeží, a nikdy nebeží rýchlo.

Riešenia jednotlivých podúloh

  1. Heslo sa nachádza v súbore. Keď zadáme cat heslo.txt, vidíme, že tam je množstvo náhodných znakov. Máme dve možnosti - pomocou príkazu strings vieme vyhľadať len čitateľné texty. Tento príkaz má aj parameter -n, ktorý špecifikuje, koľko minimálne znakov musí mať text. Takže vieme použiť príkaz strings -n 10 heslo.txt. Druhá možnosť bola použiť grep s vhodným regulárnym výrazom.
  1. Vidíme, že heslo je 2 krát base64 enkódované. Na dekódovanie ho teda “pipeneme” cez príkaz base64. Kompletný príkaz je teda echo 'Ympkek1HRnZNbXd3YkRGdU9EbHFNUT09Cg==' | base64 -d | base64 -d
  1. Vidíme heslo, ale po prečítaní nevieme zistiť, čo v ňom je a ani grep ho nevie nájsť. Príkaz na zistenie typu súboru je jednoduchý - file. Takže vieme použiť file heslo a zistíme, že sa jedná o JPEG obrázok. Keďže na termináli nevieme otvárať obrázky, tak môžeme použiť trik, ktorý bol popísaný v predošlej úlohe a stiahnuť si ho na počítač.
  1. Toto bola len demonštrácia toho, že v suid programoch vieme mať iné práva. Keďže máme spustený suid príkazový riadok ako používateľ level4, vieme prečítať obsah súboru pomocou cat.
  1. Prečítame si program. Napriek tomu, že je v jazyku C je celkom priamočiary. Program si od používateľa vypýta číslo, a ak je toto číslo rovné kľúču, program spustí system("cat ./heslo.txt"), čím prečíta a vypíše heslo.
  1. Opáť sme v podobnej situácii ako v predošlom príklade. Teraz ale nevidíme výstup programu, takže nám nestačí napísať cat heslo.txt. Existuje veľa možných riešení, napríklad spustiť príkaz chmod a+r heslo.txt, čím sme povolili všetkým používateľom čítať súbor.
  1. Napriek tomu, že heslo nevieme prečítať vieme zmeniť jeho názov. Takže mv heslo.txt x a následne pomocou programu prečítame x.
  1. Autor programu nám chcel zamedziť čítať súbory z iných priečinkov tým, že nám zadal začiatok cesty cat ./tuniejeheslo/. Našťastie sa mu to nepodarilo, pretože vieme z toho vytvoriť príkaz cat ./tuniejeheslo/../tujeheslo/heslo.txt.
  1. Pomocou príkazu sleep vieme počkať pár sekúnd, nevieme ale čítať súbory. Vieme to vyriešiť napr. znakom ;. Ak vložíme 1;bash, tak z toho vznikne sleep 1;bash. Teda najprv počkáme sekundu a potom sa nám otvorí príkazový riadok s právami používateľa level9. Problém, s ktorým ste sa mohli stretnúť boli medzery - scanf skončí čítanie pri medzere, čo znamená že napr. 1;cat heslo.txt nefungovalo a bolo treba nájsť nejakú cestu okolo toho.
  1. Nevieme síce vylistovať obsah priečinku, to ale neznamená, že nevieme čítať súbory v ňom. Musíme však poznať ich názov. Našťastie možnosti pre názov tu nie je veľa. for m in {00..12}; do for d in {00..31}; do cat "./obsah_tohto_priecinku_je_tajny/backup-$d-$m-18" 2>/dev/null; done; done; prejde cez všetky možnosti v roku 2018. Pomocou 2>/dev/null nebudeme vypisovať chybové hlášky a vypíše sa nám heslo.

Diskusia

Tu môžte voľne diskutovať o riešení, deliť sa o svoje kusy kódu a podobne.

Pre pridávanie komentárov sa musíš prihlásiť.