Po drátě 3: řešení úlohy č. 5

Není třeba velkého zkoumání na to, abychom zjistili, že před sebou máme kernelový modul. Jak naznačuje komentář, nejprve bychom si měli sehnat zdrojáky kernelu verze 2.6.27.4.

Potom máme dvě možnosti: Pokud věříme autorům hry, že nechystají žádnou lumpárnu, stačí zdroják jen zběžně proletět a všimnout si, že vytváří nějaké znakové zařízení, zkompilovat (přesně tím příkazem v komentáři) a insmodnout. Pohled do /proc/devices nám napoví major, stačí tedy jen vytvořit si /dev/password pomocí mknod a pustit na něj cat.

Lidé podezíraví, jakož i líní kompilovat nový kernel, mohli místo toho pečlivě projít všechny funkce volané v pass_read, rozmyslet si, co dělají, a heslo odhalit. Úlohu si tak jistě užili výrazně víc :-)

Komentář

Se staršími verzemi kernelu není úspěch zaručen - přesněji řečeno, dokonce jsme se snažili, aby heslo bylo pokud možno aspoň trochu špatně. Zaskočilo nás množství hráčů upozorňující na "chybu" navzdory tomu, že jsme jim řekli, s kterým kernelem je třeba modulek provozovat. Ale tak to bohužel s kernelovými moduly chodí i ve skutečnosti.

A proč vlastně starší kernely tiskly na třetím místě hesla jiné znaky než robůtkem očekávané e? Může za to následující řádek:

sprintf(xbuf, "%pF", pass_release);
Zatímco ve starších kernelech na tento format string bylo reagováno tak, jak by člověk od sprintf podle C99 očekával (tedy ukázal by nám adresu funkce pass_release, což zjevně dopadne dost různě na to, aby se to nedalo použít jako kus hesla), nový kernel přidává jistá rozšíření a použijeme-li nyní format string "%pF", objednáme si jméno funkce.

Mimo různých hesel typu sn0zenka či snfzenka získaných na starších kernelech nás asi nejvíc zaujala následující sekvence hesel k šesté úloze zaslaná jediným hráčem:

02:30:48	6:bagr
02:31:04	6:error
02:31:38	6:gcc
02:32:03	6:nevim prekadat se to asi nema
02:32:34	6:incude
02:33:16	6:eflkbkfk
02:33:39	6:help
02:35:09	6:Please help me
02:35:53	6: ach jo fakt nevim
02:36:28	6:cimrman
02:38:10	6:prdim na to  jdu spat
02:39:03	6:netusim
02:48:40	6:pass
02:48:59	6:Dratenici
03:18:59	6:modul
03:28:19	6:no nic pockam si na vysledky
03:29:36	6:Top secret

Autoři:

--- password.c
+++ password.c
@@ -103,5 +103,5 @@
 module_init(pass_init);
 module_exit(pass_exit);
 
-MODULE_AUTHOR("Dratenici");
+MODULE_AUTHOR("Ledni Medvedi (Martin & Anicka)");
 MODULE_LICENSE("GPL");
Re: Po drátě 3: řešení úlohy č. 5 radomir.cernoch (3. 12. 2008 - 21:33) Sbalit(1)
Nebylo ani nutné odhadovat, co funkce dělají -- pomohlo copy&paste ze zdrojáků jádra. Dostal jsem se k "sn-zen--", což už se dá tipnout.
Re: Po drátě 3: řešení úlohy č. 5 d.petr (4. 12. 2008 - 8:55) Sbalit(1)
Tuto úlohu jsem vyřešil asi jen s velkým štěstím. Před pár dny jsem si totiž kompiloval právě použité jádro, takže vše bylo nainstalováno a připraveno, stačilo jen spustit překlad a správný modul byl hotov. Určitý čas mi zabralo přemáhání, zda ho mám spustit, nebo se na soutěž radši vybodnout, ale pak jsem uvěřil orgům, že nemají zájem v mém PC dělat lumpárny a modul spustil. No a pak trvalo ještě relativně dost dlouho, než jsem zjistil major potřebného zařízení a než jsem zjistil, jak to zařízení vytvořit.
Zkoušel jsem koukat i do zdrojáku, ale nic jsem tam nevykoukal, takže jediná cesta byla "spustit".
(Cha. :-D Po odeslání výsledku jsem se dozvěděl, že jsem učinil první krok k tomu, abych se stal kernelovým hackerem (nebo tak nějak to bylo psáno). Tak to tedy bylo dost nadsazené tvrzení. :-D )
Re: Po drátě 3: řešení úlohy č. 5 ernie (4. 12. 2008 - 21:24) Sbalit(1)
No poslal jsem to, poslal, v domění, že po x špatných odpovědích se robůtek slituje a pošle nápovědu :D