Jak pěstovat v CTF
Moc děkuji Vitce za inspiraci k napsání této stránky.
Jak začít obráceně?
Moje tipy, jak začít hned teď:
Moje tipy, jak začít hned teď:
- Prvních 5-10 laboratorních částí si udělejte z https://yutewiyof.gitbook.io/intro-rev-ida-pro/ — abyste si trochu osvěžili teorii a seznámili se s nástroji. Myslím, že je vhodné vyřešit co nejvíce úloh, ale odtud jsem nevyřešil téměř nic (pssss), protože mi stačila kniha „pitva ukáže“, ale samozřejmě v ní moc témat není.
- Yashovy články jsou také ve video formátu – takhle je snazší a rychlejší postup na vyšší úroveň, ale ještě jsem je neviděl/a zyyyy https://youtube.com/@yashechka85
- Také si myslím, že prvních 5-10 z (https://backoftut.gitbook.io/intro-cracking-with-ollydbg/ch-01)
- Dále se podívejte na všechna videa z https://forkbomb.ru/tasks a vyřešte každý úkol ve videích, zkuste po každém videu vyřešit 3–4 úkoly, ze kterých si můžete vybrat a které jsou po videu nabídnuty.
- Hrajte CTF s přáteli, zkoušejte a zkoušejte, přesvědčte přátele, aby se sešli a hráli společně, přihlaste se k odběru telegramových chatů o tomto CTF a zkoušejte to, i když jsou na těžké úrovni, a pak si nezapomeňte přečíst články po CTF.
- Myslím, že i v jiných směrech by CTF měly sledovat série od Forkbombu https://forkbomb.ru/tasks
Jak jsem začal obráceně, co jsem zkusil, s čím jsem žil?
„Samuraj nemá cíl, existuje jen cesta.“ V. Volkov (stále 0 ze 7 cvičení v programu)
(Chtěl jsem jen popsat, jak jsem začal obráceně, ale tento příběh se protnul s mým životem)
Docela těžký příběh. Začal jsem na začátku třetího ročníku (není už pozdě) a snažil jsem se vybrat si prioritní směr v CTF a směr, kterému bych, jak se mi zdá, mohl věnovat celý život, který bych si sám rád vyzkoušel, zdálo se mi, že nejblíže mi je obrácený směr. Ale upozornění, je téměř nemožné vybrat si směr, když o žádném směru nevíte absolutně nic – myslím, že nejlepší akcí je v tomto případě pokusit se alespoň něco udělat, takže jsem začal trochu sledovat obrácený směr. Ale ve skutečnosti jsem nesledoval absolutně nic. Byl jsem jen nervózní a nevěděl jsem, co mám dělat, absolutně.
Další zlom v mém životě nastal, když se úžasná dívka Ksenia Naumovová pokusila z naší univerzity získat stáž (možná to opravdu ovlivnilo můj život, za což jsem jí velmi vděčný), ale její směřování se týkalo sítí. Když jsem jí psal informace o sobě, napsal jsem, že mě reverz zajímá, i když jsem v té době nikdy neviděl assemblerový jazyk, no, moje volba hodně ovlivnila můj osud. Nenabídla mi účast na její stáži, ale předala můj životopis velkému a mocnému Alexeji Višňakovovi (alias hlavnímu v reverzním VPO). Ve stejný den mi zavolal náborář a no, teď už jsem měl 4 dny na to, abych se reverz naučil od nuly, což je samozřejmě nemožné. Ale alespoň jsem za 4 dny tvrdě pracoval a z různých článků jsem získal první představu o tom, co reverz je.
A tak jsem měl pohovor na sociální zabezpečení, poprvé jsem viděl assembler přesně 2 hodiny před pohovorem, ale už jsem zvládal jednoduché operace. Višňakov byl samozřejmě šokován mými slabými dovednostmi, ale dal mi dobrou radu, abych se naučil assembler, OS, alespoň zkusil reverz a hlavně abych se o to zajímal. A na konci online pohovoru jsem požádal o svolení, abych za ním později znovu přišel, souhlasil. Pak jsem se rozhodl začít studovat reverz. Moje volba padla na knihu „Pita ukáže. Praktická analýza malwaru“. Proč zrovna tato kniha, prostě tato kniha byla malá v téměř každém výběru věnovaném materiálu o reverzu + v té době jsem znal jen jedno využití reverzu v budoucnu – to je analýza malwaru.
Ale učit od nuly sám, aniž bych věděl, na koho se obrátit, koho co řešit, kde se podívat alespoň na nějaké analýzy, to je, mírně řečeno, velmi obtížné. Snažil jsem se knihu číst před spaním/v noci, ale všechno mi bylo jasné, měl jsem pocit, že ničemu nerozumím, a tak jsem 2 měsíce, listopad a prosinec, marně trpěl a smysl byl téměř nulový. Bylo by možné pozvat někoho, aby s vámi studoval, ale každý má své záležitosti a obecně, jak někoho přesvědčit k něčemu, když sám nevíte, jestli je to vůbec možné. Ale přesto jsem neztratil víru a bojoval jsem dál, doufám, že to uděláte i vy.
Další zlomový bod byl v lednu, novoroční prázdniny, spousta času před semestrem a mezi zkouškami, myslím, že by se každý měl snažit využít takový čas na maximum, stejně jako letní čas, pokud ho má volný. Tu zimu jsem se o to poprvé pokusil. Rozhodl jsem se, že si dám tolik času, kolik potřebuji na zvládnutí knihy, a znovu jsem se k ní posadil. A kupodivu jsem to tentokrát nezačínal od nuly a cítil jsem, že už v té době mám nějaké dovednosti, a bylo to pro mě o něco jednodušší. A celou knihu jsem dokázal přečíst za jeden měsíc, ale ve skutečnosti jsem opět nechápal složitá témata kapitol v knize. Ale opravdu jsem se 2 dny v kuse trápil s windbg, abych dokázal dokončit laboratorní cvičení s rootkity. Ale čtení knihy bylo dlouhé a těžké, kniha je stará a já ani nevěděl o existenci tlačítka f5, které převádí kód v assembleru do C, vidíte, reverzní inženýrství jsem se učil od nuly prohlížením obrovských výpisů v assembleru, čisté peklo. (Ale jeden z mých dobrých přátel mi pomohl, ale o tom později)
A pak jsem cítil, že jsem udělal docela velký pokrok, že něco dokážu a teď už assembler docela dobře ovládám, mám zkušenosti s reverzací jednoduchých programů, ale byla tu jedna věc, opravdu jsem všechno zvládl opakováním cvičení z knihy (ale pak mi došlo, že nic nedokážu udělat od nuly, sám, bez vnější pomoci).
A pak jsem se rozhodl jít za svým starým přítelem Višnjakovem na nový rozhovor, napsal jsem mu emailem, souhlasil, že si znovu promluvím, řekl jsem mu, že jsem přečetl jen jednu knihu. Pak se ale rozhodl zkontrolovat, jak dobře jsem se naučil látku, kterou jsem si přečetl, a zeptal se mě na nejobtížnější témata v knize, a já mu samozřejmě nemohl nic odpovědět, protože to pro mě bylo všechno nové a nečekal jsem, že se ode mě budou vyžadovat tak dobré dovednosti. Další ránou pro mě byla jeho slova, že mě během stáže nikdo nic nenaučí a veškerý růst bude záviset na mně. A v další fázi, abych se k nim dostal, mi nabídl, abych si sám od začátku zpracoval 5-6 programů. To mě trochu šokovalo, byl jsem naštvaný, teprve pak mi došlo, že sám nic nezvládnu a že celý můj život bude záviset jen na mně, v té době to pro mě byla těžká rána. Bylo to dost těžké období, absolutně jsem netušila, co mám dělat, tématům v knize jsem dostatečně nerozuměla, neměla jsem se na koho obrátit, když jsem se nedokázala dostat do pozitiva, kam mám jít na stáž? V té době na nás univerzita stále tlačila, abychom si našli místo na praxi, jestli mám pokračovat obráceně, jestli v tomhle mám vůbec budoucnost. Tyto otázky mě velmi trápily a nemohla jsem studovat kvůli nejistotě, strachu o sebe, o svou budoucnost.
Tak co dělat dál?
Samozřejmě jsem se nemohl vzdát, protože v sázce byl můj život a moje budoucnost. Rozhodl jsem se, že se na chvíli nezaměřím na reverz a zkusím se podívat jinými směry, zjistit, kam se mí přátelé a spolužáci snaží dostat, zjistit, co chtějí dělat. V té době jsem začal chápat, že reverz je poměrně úzký směr a IB je sám o sobě široký. A také, že Pak přijde hrdina, mi Achmad znovu radí, abych se podíval na sérii reverzu od spbctf.
V té době jsem začal přemýšlet o CTF. Pak jsem se rozhodl trochu snížit laťku a prostě se podívat, co dělají, jaké úkoly řeší. Po vyřešení prvních úkolů jsem pocítil první radost z toho, že to můžu dělat. Rozhodl jsem se podívat na každé video a po každém videu vyřešit pár úkolů. A udělal jsem to a bylo to super, naučil jsem se spoustu nových věcí. A v té době jsem se rozhodl si pro knihu znovu sednout, ale už s mými zkušenostmi, se zkušenostmi, že je potřeba se snažit udělat všechno sám, od nuly, a teprve pak vidět, co se vám nepovedlo + nové funkce a pochopení, které jsem získal z reverzní sezóny SPBCTF + opět bylo snazší číst knihu ne od nuly, ale na třetí pokus.
A nad knihou jsem seděl někdy i 12 hodin denně, pečlivě jsem prohlížel assemblerový kód a dekompiloval ho. Disassemblingem každého programu, pečlivým pohledem na každou jeho akci, snahou pochopit, co dělá. Googlováním každé nové funkce API a vedením seznamu svých poznámek – zápisu ke každému programu. Ano, bylo to těžké, opakováním pokaždé stejných akcí jsem začal cítit, že si čím dál víc věřím a jsem schopen tuto knihu dočíst téměř až do konce znovu. Proč téměř, protože pro mě opět začala nová etapa života, kontroverzní, ale pro mě užitečná.
Hledala jsem stáž, protože jsem neměla čas na Onlantu, kam univerzita nabízela, respektive já nabízela, ale odmítli mě, protože jsem psala pozdě, zpozdila jsem se s hangárem (jak se mi tehdy zdálo). Život se zase zvrtl, stáž není, co dělat, co dělat. Proč jsem se znovu nepřihlásila do Positive – nebyla jsem si jistá sama sebou, když je tam vysoká úroveň + napsala jsem Ksenii, aby mě požádala, abych u nich alespoň absolvovala stáž, souhlasila, ale nikdy to neudělala, už jsem jí nepsala. Rozhodla jsem se podívat, jaké firmy se zabývají reverzním inženýrstvím, a byl pro mě šok, když jsem pochopila, že v Rusku téměř žádné nejsou a to jsou největší firmy, do kterých se jen tak nedostanete – to jsou Kaspersky dr web a Positive, ale možná i group ib, a při pohledu na volná místa jsem viděla, že je potřeba hodně zkušeností.
Pak jsem se rozhodl vyhledat všechny malé i velké firmy, které se zabývají analýzou virů, a nasbíral jsem jich 15-20 (později jsem přidal i ty, které nemají reverzní systémy). Čas na hledání byl opravdu napjatý – 15. dubna, a já se rozhodl poslat svůj životopis do každé z těchto oblastí. A jen jedna reagovala pozitivně. A zapomněl jsem na jednu nuanci, předtím jsem se rozhodl napsat Hangaru ze srandy, že jsem to podělal, promiňte, můžu pro vás ještě zkusit pracovat, naštěstí nám poslali emailem kontakty na náborářku a naštěstí pro mě řekla, že bude druhá vlna výběru. A pak jsem se rozhodl, že se tam pro jistotu zúčastním, i když jsem se zdálo, že jsem našel AV soft, najednou to tam nějakým zázrakem nevyjde (jak moc jsem měl pravdu). No a zároveň jsem se rozhodl nabídnout tohle místo svým přátelům a ukázalo se, že tam skončil skoro celý tým CTF Burger, no, to je fajn.
Takže začala další etapa mého života – AV soft, firma, která vyvíjí sandbox, antivirovou laboratoř, která vyžaduje různé zaměstnance, jako jsou viroví analytici, reverzéři – to je představa, kterou jsem o firmě měl, než jsem šel na stáž. Podmínky byly, jak se mi zdá, pro mě vynikající, flexibilní pracovní doba, hlavní je ne méně než 20 hodin týdně, ale měsíc neplacené stáže, s následným zvážením zaměstnání na personál. Docela přijatelné.
A tak jdu na stáž, v představách, kde je obrovská firma, mnoho reverzních manažerů, vždycky je na koho se obrátit, dostáváte úkoly, které vás rozvíjejí. Co se stalo ve skutečnosti, firma se skládá z 20 lidí, z nichž většina jsou běžní studenti, z nichž jen 3-4 jsou analytici, mezi nimiž jsem byl i já.
Pak se pravděpodobně stal jeden z důležitých zvratů, které ovlivnily můj osud, a to, že když jsem přišel, hlavní analytik, který tam pracoval 4 roky, okamžitě odešel a já ho našel jen na 3 dny, přišel jsem ve špatnou dobu nebo došlo ke smrtelné nehodě. Vůbec jsem nechápal, o co jde, a opět ten, kdo mi mohl něco vysvětlit, odešel, studenti, kteří se mnou pracovali, sami nechápali práci firmy, úkoly. Zpočátku mi překáželo, že jsem téměř nekomunikoval, ale v mé situaci to není tak překvapivé, ale přesto jsem mohl projevit více iniciativy.
Ale další období pro mě bylo opět těžké, 30 hodin týdně mi z života zmizelo, včetně práce a cestování, neustále jsem se cítil unavený, neměl jsem čas na studium, nemohl jsem myslet na práci mimo pracovní dobu, navíc jsem prostě nebyl zvyklý pracovat, nebyl jsem zvyklý se něco rychle naučit, vždycky jsem to dělal jen pro vlastní potěšení a bylo těžké být v týmu bez návyků. Ale i tak jsem nakonec začal více komunikovat, lépe chápat, co se ode mě očekává, ale stále ne úplně. Nedokázal jsem se s těmito všemi faktory adekvátně vyrovnat, zavolali mi a řekli, že mě nepřijmou do personálu, protože nejsou spokojeni s mými měkkými dovednostmi, s čímž jsem souhlasil, ale v poslední době jsem se v tomto i v hard skills zlepšil, bylo pro mě nechutné to slyšet, protože s hard skills mají podle mě v této firmě všichni problémy a já se nedokázal osvědčit.
Přesto to pro mě byla skvělá zkušenost, ale zase doba pochybností, co mám dělat, když mě ani taková společnost nedovede kam. Také jsem začal chápat, že je špatné a velmi těžké se se vším vyrovnat sám, má vůbec cenu pokračovat v opačném směru, když tam nebudu mít nikoho a proč tam sakra někoho potřebuji, proč jsem to nepochopil dřív, nebo se pokusit jít společně s klukama (mužema) do hangáru a snažit se navzájem podporovat. Tyto otázky si kladu v době psaní tohoto příběhu.
Další byl ctf od MPEI, kde jsem dokázal všechny úkoly vyřešit obráceně bez jakéhokoli procvičování ctf a pauzy od obráceného postupu. Ale stojí za zmínku, že úkoly byly samozřejmě velmi snadné, ale i tak už je to něco.
A teď se rozhoduji dohnat ztracený čas, končíme 3. ročník, další rok nám bude užitečný, zdá se, že v tuto chvíli je už pozdě začít hrát CTF, ale vše záleží na naší volbě, v očích kluků vidím touhu a podporu jeden druhého a cítím to i v sobě. Všechno teprve začíná a já udělám vše, co bude v mých silách, abych pomohl sobě i ostatním.
Doufám, že se rozšíříme na celý stream a dokonce i mezi kurzy a zanecháme tento web jako odkaz. Možná v budoucnu hodně změním názor, ale momentálně je to tak.
A znovu si musím klást otázky, co bude dál? A znovu se s nimi snažit vyrovnat. Pak pokračujeme v CTF, dále rozvíjíme sebe, komunitu a nevzdáváme se.
IDA Pro je snadno použitelný program, který vám umožňuje převádět binární kód na kód disassembler. Existuje na něj spousta pluginů a mezi reverzátory je velmi žádaný.
PS: Budeme pracovat s x86 assemblerem (ten, na kterém běží vaše PC)
Použijme to na živém příkladu
Zkusme napsat jednoduchý program v C++, zkompilovaný pomocí různých kompilátorů (msvc, mingw), nejprve zkusme přijít na to, jak bude program vypadat poté, co jej sestavíme:
Pojďme nejprve napsat jednoduchý program, abychom zjistili, jak a co je uvnitř našeho exe

Pojďme to zkompilovat na těchto kompilátorech, abychom viděli, co se stane.


Trochu pozornosti
Existují tzv. registry*, rád bych upozornil na obecné registry (eax, ebx, ecx, edx). používají se k provádění aritmetických, matematických operací (mov, inc, dec, sub, div, imul, lea atd.)
Registry se také skládají z částí, například registr rax (v 32bitovém režimu eax)
Pojďme se tedy podívat na to, co se děje v samotném sestaveném souboru.
MSVC
`_main proc near` – znamená, že zde začíná hlavní funkce (v C++ je to začátek programu)
`push esi` – znamená, že přidáme na vrchol zásobníku (uložíme) obsah v registru esi
`push 400h` – znamená, že do zásobníku přidáme hodnotu 0x400, tedy 1024
`call ds:malloc` – zde voláme funkci malloc (přidělení dynamické paměti), přičemž jako argument předáme 1024 (velikost přidělené dynamické paměti)
`mov esi, eax` – sem umístíme výsledek volání funkce malloc (eax je adresa přidělené paměti)
`push esi` – zde je stejný příběh s malloc, přidáme do zásobníku hodnotu, která leží v esi (to znamená umístěný eax ukazatel)
`Formát push offset ; “%s”` – zde předáme formát řetězce %s znamená pouze řetězec
`call sub_FD1050` – zde voláme funkci na adrese 0xFD1050, to znamená, že kompilátor vytvořil funkci, přes kterou přistupujeme k vfscanf
`push esi` – stejné jako při volání s malloc, jen je nyní předáno jako argument jiné funkci (printf)
`Formát push offset ; „%s“` – totéž, ale pouze pro volání printf
`call sub_FD1020` – zde voláme funkci, která se nachází na adrese 0xFD1020, je stejně jako v předchozí funkci „odrazovým můstkem“ mezi funkcemi C a C++
`add esp, 14h` — zvýšením ukazatele zásobníku o 0x14(20) vymažete zásobník
`xor eax, eax` – zde provedeme operaci XOR (OR), v tomto případě resetuje hodnotu registru eax na 0, použije se xor, protože je o 2 byty kratší
`pop esi` – pamatujte, že na samém začátku jsme přidali hodnotu registru esi na vrchol zásobníku, takže teď to máme
`retn` – znamená, že hlavní funkce byla úspěšně dokončena
`_main endp` – znamená, že ukončujeme funkci main
Tento příklad vám ukázal, jak program funguje na úrovni assembleru.
Min-GW
`_main proc near` —
`push ebp` – přidejte registr ebp na vrchol zásobníku (stejně jako v předchozím příkladu vám umožňuje uložit hodnotu ebp)
`mov ebp, esp` – přesunout hodnotu registru esp do registru ebp (vytvořit zásobníkový rámec* pro tuto funkci)
`a esp, 0FFFFFFF0h` – zarovnat esp na 16bajtovou hranici (0x0FFFFFFF0 znamená -16)
`sub esp, 20h` – alokovat 32 bajtů (0x20) v zásobníku
`call ___main` – volá se funkce ___main, která je potřeba k inicializaci statických objektů
`mov dword ptr [esp], 400h` – zapíše hodnotu 0x400 (1024 do zásobníku)
`call _malloc` – volání funkce pro alokaci samotné dynamické paměti
`mov [esp+1Ch], eax` – jak je uvedeno výše, registry 32bitového režimu mají velikost 4 bajty, 1Ch (tj. 0x1C (tj. 12)) znamená, že hodnota registru eax (tj. adresa začátku přidělené paměti) je umístěna v zásobníku za tři stejné registry na zásobníku, proč tři (12/3=4)
`mov eax, [esp+1Ch]` – tady se děje něco divného, zde vložíme hodnotu adresy 1C (12) (kde bylo zkopírováno eax) do eax (podivné Min-GW) :)
`mov [esp+4], eax` – zde posuneme hodnotu z eax do zásobníku po jedné
`mov dword ptr [esp], offset Formát ; „%s“` – zde předáme formát řetězce na začátek zásobníku
`call _scanf` – volání funkce _scanf
`mov eax, [esp+1Ch]` – zde znamená, že na zásobníku vezmeme stejnou hodnotu, jakou jsme uložili na začátku provádění programu
`mov [esp+4], eax` – zde je hodnota, kterou jsme obdrželi, umístěna za jeden registr na zásobníku
`mov dword ptr [esp], offset Formát ; „%s“` – zde předáme formát řetězce na začátek zásobníku
`call _printf` – volání printf
`mov eax, 0` – zde zapíšeme 0 do registru eax (abych byl upřímný, mohli bychom mít xor eax, eax)
`leave` – zde se hodnota registru ebp obnoví ze zásobníku a hodnota esp se přesune na ebp.
`retn` – zde se funkce vrátí a návratová adresa se obnoví.
`_main endp` – konec hlavního
Něco málo o pluginech
Existuje mnoho pluginů pro IDA Pro, x64dbg (například snowman), které vám mohou usnadnit rozebrání a analýzu programu. Rád bych vám předvedl fungování pluginu jednoho pluginu, Hex-Rays Decompiler, k čemu slouží? Hex-Rays Decompiler se používá k překladu obskurního assembleru do pseudo-C syntaxe (někdy to může pomoci, pokud nejste zvyklí pracovat s assemblerem, ale někdy to nebude fungovat podle očekávání).
Chcete-li vyzkoušet „Převést“ assembler do C, stačí stisknout klávesu F5 a získáte pseudo C kód
uvidíme, jak bude vypadat program, který jsem napsal. pokud použiji tento plugin:
Min-GW:

MSVC:

Výsledky
Vše výše uvedené bych rád shrnul tím, že assembler není jednoduchá věc, jak se na první pohled zdálo. Doporučil bych nejprve přečíst pár knih o assembleru, abyste mohli začít s reverzním inženýrstvím, například knihu od Yuri Magda Assembler pro procesory Intel Pentium