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");
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 )