Coder Battle: Ja vs. Taj VNC Guy

В ovaj blog Objavljeno je dosta priča o programerima. Volim da se prisećam svojih starih gluposti. Pa evo još jedne takve priče.

Prvi put sam se zainteresovao za kompjutere, posebno za programiranje, kada sam imao oko 11 godina. Na početku srednje škole bоVećinu svog slobodnog vremena proveo sam petljajući po svom C64 i pišući BASIC, a zatim makazama izrezao loš kod. Ne šalim se, makaze.

Nakon škole (oko 16 godina), britanska djeca obično idu na koledž, gdje biraju da uče tri ili četiri predmeta prije odlaska na fakultet. S obzirom na moju ljubav prema bež kutiji i kasetofonu kod kuće, odlučio sam da je studiranje „informatike“ na koledžu pravi izbor.

Uživao sam u kursu više nego što sam očekivao; tamo sam prvi put sreo Pascal i Delphi.

U pauzama između časova učenici su mogli da rade na bilo kojoj slobodnoj mašini u računarskoj učionici. Zamislite: ogromnu prostoriju, dizajniranu za stotinjak ljudi, sa redovima stolova ispunjenih mašinama, poput onih gdje monitor stoji na sistemskoj jedinici. Navijači neprestano pjevuše, loptice miša zuje po stolovima, ne prestaju ni na sekundu. Čudan je miris u vazduhu, kao da se 50-100 hormonskih tinejdžera povremeno menja da hladi stotine Pentium III čipova.

Uprkos zdravstvenim rizicima, voleo sam da sedim za kompjuterom kada sam imao slobodan minut.

Dežurni administrator u prostoriji bio je nizak muškarac srednjih godina koji je izabran za ovu ulogu zbog svoje nezasitne želje da postane zli diktator. Pretpostavljam da je tako. Dežurstvo je malo reči, momak je zaista voleo svoj posao. Imao je zadatak da održava red kako niko ne bi koristio školski kompjuter za bilo šta neprimjereno.

Do danas mi intuicija govori da je admin bonus direktno zavisio od broja učenika koje je uhvatio za ruku i ispratio iz kompjuterske sobe. Prilično sam siguran da je ovaj tip prijevremeno otplatio hipoteku.

Sedeo je u krajnjem uglu kompjuterske sobe za ugaonim stolom. I bilo je sigurno pretpostaviti da su njegovi monitori plodnosti pronašli način da se razmnožavaju uz impresivno kratak period trudnoće, bilo ih je toliko mnogo. Moglo se samo zapitati da li je zaista imao vremena da ih sve prati. Naravno, šalim se... jesam li spomenuo da je vrlo ozbiljno shvatio svoj posao?

U to vrijeme, na računarskoj mreži je bio pokrenut Windows 2000. Ubrzo sam otkrio da se svaki put kada se prijavim na sistem, pokreće skripta koja je specificirala pokretanje VNC servera sa administratorskog naloga za daljinski pristup radnoj površini. Kad god je ovaj tip htio da vas špijunira, povezao bi se direktno na vašu mašinu i gledao. Bilo je jezivo, a sada kada razmislim, vjerovatno nezakonito.

Pošto sam se zagrizao na BASIC-u i C64, sada sam pisao na C-u, pa čak i na malo C++-a. U to vreme još sam bio veoma zainteresovan za jezik D, koji je ispravio neke nedostatke C++, kako sam ga tada video.

Ulazio sam u kompjutersku sobu da pročitam nešto novo o D ili se igram sa kompajlerom Digital Mars D. Ponekad, dok sam bio ometen od razmišljanja o velikoj budućnosti D, pisao sam C kod za hakovanje drugih Win32 programa kroz njihov prozor ručke.

U dobra stara vremena Win32 programiranja, pronalaženje ručke prozora je bio najlakši način za hakovanje drugih programa. Očigledno je da su svi GUI programi na Windows-u imali prozor, čak i ako se nije pojavio na ekranu. Pisanjem programa za dohvaćanje ručke drugog procesa (u suštini veze do njega), možete mu slati poruke. Ovo je omogućilo neke osnovne operacije kao što je skrivanje/prikazivanje prozora programa, kao i stvarno cool stvari poput prisiljavanja procesa da učita proizvoljni DLL u svoj memorijski prostor i počne izvršavati kod. Nakon DLL injekcije, zabava je počela.

U prvih mjesec i po dana ovaj detektiv mi nije mnogo smetao, samo se jednom ili dvaput povezao na VNC server na mojoj mašini. Ali jedna posebna sesija je možda izazvala njegovo interesovanje. Pisao sam neki C kod da sakrijem prozore Minesweeper-a (bez da ih zatvaram) kako bih lakše igrao na času, kada sam primijetio da je bijela VNC ikona u sistemskoj paleti postala crna. To je značilo da me sada posmatra.

Nastavio sam s kodiranjem kao i obično, pokušavajući ga ignorirati. U međuvremenu, mašina je počela da usporava, pokušavajući da prenese maksimalnu brzinu kadrova na jedan od bezbrojnih monitora u uglu sobe. Windows je skoro prestao da reaguje, kada mi je ponestalo strpljenja, odjavio sam se i završio za taj dan.

Prilikom narednih posjeta kompjuterskoj sobi, Colombo se gotovo svaki put živo zanimao za ono što radim. Otprilike nakon četvrtog puta, odlučio sam: moram nešto učiniti po tom pitanju.

Priznajem da je razumna, racionalna osoba mogla jednostavno pokrenuti ovo pitanje direktno njemu ili njegovom šefu. Međutim, uvijek sam se predavao iskušenju i brzo sam sebe nagovarao da usvojim potpuno drugu strategiju.

- Ne možete ništa bez ovog VNC servera! – rekao sam sebi više puta smireno i odlučno.

Bilo je potrebno ubiti VNC.

Počeo sam da ulazim u kabinet sa velikim grupama učenika i da sedim što dalje od ugla sa monitorima. Ovo je funkcioniralo neko vrijeme i dalo mi je vremena da testiram ideje.

Moj prvi pokušaj, složićete se, bio je prilično slab. Desnim klikom na VNC ikonu u sistemskoj paleti, ugledao sam meni sa magičnim slovima EXIT. Nažalost, slova su ispisana sivim okvirom teksta. Administrator je onemogućio stavku menija "Izlaz" kroz uređivač smernica grupe. Pokušao sam da ubijem proces iz Task Manager-a, ali mi je naravno bio nevidljiv jer je radio pod drugim, privilegovanijim nalogom. Nije išlo.

VNC server radi na TCP portu 5900, sjetio sam se. Moj sljedeći plan je bio da pošaljem oštećene pakete na ovaj port kako bih ga srušio.

Proveo sam barem nekoliko dana petljajući po protokolu, šaljući razne oblike dobro strukturiranog sranja na port 5900 i nadajući se da će se pokvariti. Na kraju, ni to nije išlo.

Već sam počeo da razmišljam da se neću moći otarasiti ove stvari, kada mi je odjednom sinulo: tamo mora da postoji prozor! Moramo ga prikazati. Možda će imati fino sočno dugme za „Mute“ koje mogu odlično iskoristiti!

Pokrenuo sam svoj sada skoro savršen C kod da pronađem ručicu glavnog prozora drugog procesa - i sigurno je VNC pronađen. Osjetio sam inspiraciju kada su mi prsti kucali WM_SHOWWINDOW. Pokušaj da pogodiš šta sam video ispred sebe?

Ništa

Sad sam bio radoznao... imao je prozor, ali je ignorirao moje poruke. Dvaput sam provjerio svoj kod kako bih bio siguran da radi. Testirao sam ga na nekoliko drugih procesa i odlično je radio. Pokušao sam poslati druge poruke u VNC prozor, i dalje ništa.

A onda mi je opet sinulo!

Zahvaljujući veoma debelom knjiga Charles Petzold Pažljivo sam proučavao kako Win32 procesi funkcionišu unutar sistema. Svaka Win32 aplikacija ima prozor kao i "red poruka". Poruke pokrenute interakcijom korisnika, kao i poruke koje šalje sam Windows, stižu u red čekanja, a aplikacija sama odlučuje kako će ih obraditi.

Nije baš zanimljivo samo po sebi. Ali kada sam shvatio da je dovoljno veliki red neobrađenih poruka djelovao kao heuristika za Window Process Manager da interveniše u obješenom procesu, počeo sam da se znojim od čistog serotonina.

Bez gubljenja sekunde, vratio sam se svom C kodu, pripremajući se da pošaljem još jednu poruku u glavni VNC prozor WM_SHOWWINDOW. U ciklusu. Eternal. Dakle, puno poruka. WM_SHOWWINDOW, za koji sam sada znao da će VNC pokušati potpuno zanemariti... na svoju opasnost.

Sastavio sam i pokrenuo 4KB koda koji najviše voli slobodu u svom životu. Nakon otprilike tri sekunde, Windows je prijavio da je proces vncserver.ехе ne odgovara, i dao sam ponudu koju jednostavno nisam mogao odbiti:

Želite li završiti ovaj proces?

HELL YES!

Dozvolite mi da priznam da sam ostatak dana bio nepodnošljivo zadovoljan sobom.

Nakon nekoliko sati provedenih u varenju svoje nove supermoći, odlučio sam kako ću je iskoristiti. Bilo je previše lako ubiti sesiju pred njim. Imao sam bolju ideju - da potpuno nestanem.

nakon vatreno krštenje sa programiranjem utičnice Shvatio sam da mogu napisati kod koji bi radio dvije stvari. Prvo će zauzeti novooslobođeni TCP port 5900, koji je prethodno bio okupiran nerazumnim VNC serverskim procesom. Zatim će kreirati novu TCP vezu sa VNC serverom navedene mašine. Kod će jednostavno proxy sve podatke između dva soketa, a Columbo će misliti da se povezuje sa mnom, a zapravo će se povezivati ​​na potpuno drugačiji VNC server.

Moj kod će služiti kao tajni most između mene i neke druge jadnice koju odaberem. Bilo je divno.

Odmah sam počeo pisati svoj lažni VNC most. Kolumbo se povezao sa mnom nekoliko puta, ali sam nastavio da programiram ispred njega. Došao sam do zaključka da on nema pojma šta radim, iako sam napisao očigledne stvari poput brojeva portova i komentara poput // Прощай, жуткий шпион VNC.

Nakon nekoliko dana nisam mogao natjerati kod da radi ispravno. Da stvar bude gora, radio sam skoro neprekidno sa crnom VNC ikonom u sistemskoj paleti. Dok je bio povezan, nisam mogao osloboditi port da testiram svoj kod.

Da sam tada znao netcat!

Na kraju su mi popustili živci, ipak sam bio nestrpljiv momak od 17 godina. Gledajući kako bijela ikona VNC servera ponovo postaje crna, prepao sam se, otvorio originalni kod koji je popunjavao red poruka i pokrenuo ga pred njegovim očima. Čak sam čekao nekoliko sekundi prije nego što sam kliknuo End Process, samo da bude siguran da je to vidio.

Ako me pritisak na to dugme nije u potpunosti uvjerio da je vrijedno toga, onda je on iskočio iza svoje tvrđave monitora da mi brzo priđe i izvede me iz sobe.

Kao rezultat toga, bio sam zabranjen pristup mreži dvije sedmice. Poštena kazna, pomislio sam. Nakon otprilike tri sedmice, VNC server je nestao iz skripti za pokretanje sistema i nikada se nije pojavio nigdje drugdje. Nikada nisam znao da li je moj incident imao ikakvu ulogu u tome ili ne, ali je potpuno uništio moj plan da se fantastično obogatim prodajom svog VNC pištolja depresivnim studentima u kompjuterskim salama koledža širom zemlje.

izvor: www.habr.com

Dodajte komentar