Ezen a hétvégén a szórakozás hiperkocka változatát választottam: a CrySys csapatával részt vettem az idei iCTF játékon, és megoldottam a GCHQ kémfeladványának izgalmasabb részét. Előbbiről remélem hamarosan össze tudunk hozni valamilyen összefoglalót, utóbbiról ebben a posztban fogok megemlékezni.
Aki ismer, az tudja, hogy általában nem igazán szeretem a "kincskeresés" jellegű ("találd meg a képbe rejtett jelszavazott ZIP fájlt, aminek páronként fel vannak cserélve a bájtjai") feladványokat, amilyeneket a hasonló internetes versenyeken fel szoktak adni. Akkor kezdtem el foglalkozni egyáltalán a dologgal, mikor kiderült, hogy a "megoldást" beindexelte a Google... Mint kiderült, a Naked Security - akiket a brit titkosszolgálat megbízott a verseny lebonyolításával - olyan feladatokat eszelt ki, melyek még úgy is oda tudtak szögezni a gép elé, hogy pénteken már kifárasztottak, és alapvetően nem is érdekelt a téma. A feladatok játékosan kérnek számon a mindennapi munka/hackelés során is gyakran felmerülő képességeket olyan szinten, hogy azért ne kelljen kellemetlenül sok időt eltölteni a megoldással. A végigjátszást ezért mindenkinek ajánlom. Az alábbiakban igyekszem nagy vonalakban bemutatni a megoldást és a buktatókat, ezzel remélem segítek annak aki elakadt, de teljes megoldást közelről sem közlök, hogy megmaradjon az élvezet :) Szóval innentől vigyázat, spoiler alert!
Az első szinten megjelenő byte-sorozat Linux byte-kód, amiben feltűnőek lehetnek az 41414141 illetve 42424242 szavak, melyeket többször a cmp utasítás opkódja előz meg. ELF fejlécek nincsenek, szóval vagy írunk egy wrappert az egész köré, mint egy shellcode esetében, vagy objdumppal nyerünk egy disassembly-t, amit nasm-al leforgatunk. Rövid debugolás után kiderül, hogy a 42424242 szekvenciát sehogy sem találja a stacken a drága, minek következtében kilép. Itt jön egy kis treasure hunt: A byte kódot ábrázoló PNG kép kommentárjában egy base64 kódolt valami tanyázik, ezt dekódolva, éppen az áhított BBBB szekvenciával kezdődő szemetet kapunk. Ezt a kód végére csapva már ki is elégítettük a szörny minden kívánságát. Az okosok szerint a drága egy RC4 algoritmust futtat, minden esetre ha kilépés előtt megvizsgáljuk a program memóriáját, találunk egy HTTP kérést a második feladatra (vagy guglizhatunk :).
Itt egy JavaScriptbe hányt virtuális számítógép processzorának utasításkészletét kell megvalósítanunk. Ez meglepően egyszerű lenne, ha nem úgy dokumentálták volna a "hardvert", ahogy a legtöbb szoftvert szokták a valóságban - ettől meglepően életszagúvá válik a feladat. Az például, hogy az utasítások második bájtja opcionális, azt jelenti, hogy minden utasítás két bájtos, kivéve a nop (azaz a nem meglépett feltételes ugrás). Lehet hogy én vagyok a láma (nem olvastam elég Intel doksit), de az is elég nehezen esett le, hogy az r1 nevű első regiszter néhány sorral később már az első operandus által meghatározott regisztert jelöli (az rx-et meg találd ki). Viszont az, hogy ugyanitt a sima jmp nem a második operandus által meghatározott regiszterből (r2) szedi a megcélzandó szegmenst, hanem az operandus értékét követlenül használja (ez elég szépen kijön, mikor a program először próbál egészen lehetetlen helyekre ugrani), az kicsit kiakasztott így este 10 körül :) Ehhez képest az az apróság, hogy a készen kapott implementáció nem igazán támogatja az r4=cs, r5=ds megfeleltetést, már lepattant rólam - ezt legalább dokumentálták. Mindezek ellenére szerintem ez volt a konteszt legjobb része, végre kiélhettem a C-stílusú switch-case szerkezetek és harmadfokú operátorok iránti perverzióimat :)
A harmadik, és egyben utolsó szint egy Cygwin-es EXE debugolásáról - és még egy kis kincskeresésről - szólt. Az állomány egy meghatározott tartalmú licensz fájlt keresett maga körül. A tartalom első négy bájtja minimális erőfeszítéssel meg- illetve kitalálható. A következő 8 karaktert a program egy egyszerű crypt() bemeneteként használja, melynek kimenetét egy előre meghatározott értékkel hasonlítja össze. Itt bizony elő kell venni a nehézfegyvereket, John barátunkat, vagy egy kellően színes szivárványtáblát, de ne aggódjatok, hamar kipörög a megoldás (főleg, ha optimalizál egy kicsit az ember, például az ismert jelszóhossz alapján). Ha idáig eljutunk, a program egy újabb HTTP kéréssel jutalmaz minket, amire azonban 404 a válasz. A kérés valamint a program további tanulmányozásával hamar rájöhetünk, hogy még 12 bájt hiányzik a licenszünkből, ezeket kellene ugyanis a webes útvonal végére helyettesíteni. Aki azonban az előző két feladatot gondosan megoldotta, emlékezhet, hogy volt ott éppen 3x4 feltünően magányos bájtocska, amik éppen ide illenek ;)
kz71 2011.12.06. 00:32:08
érdekes, hogy pizza-s feladat nem volt...
a profik: kulfold.ma.hu/tart/cikk/b/0/114747/1/kulfold/A_Pizza_Hut_buktatta_le_a_CIA_kemeket
kz
conscience 2011.12.08. 01:04:46
Congratz
" az áhított BBBB szekvenciával kezdődő szemetet kapunk" - és az AAAA? Eltűnt az éterben? :D
A treasure huntot én sem favorizálom. A ternary meg jóbarát; egysoros metódus for president
buherator · http://buhera.blog.hu 2011.12.08. 10:16:01
conscience 2011.12.09. 00:16:07
btw, no offense, csak nem akartam még egy 65536. szmájlit is bevésni, mert marha hülyén veszi ki magát.
jónyóc és sok szerencsét az eheti utolsó munkanaphoz!
con