====== Útok pomocí přetečení zásobníku ====== ===== Domácí příprava ===== Většina informací potřebných pro řešení této úlohy zazněla na přednášce. Dále se vám můžou hodit i následující informace: * Jak funguje protokol [[https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Request_message|HTTP 1.1]] ([[https://tools.ietf.org/html/rfc7230#section-3|specifikace]]) * Příkaz ''nm''. * Základní příkazy debuggeru gdb: run, break, print, next, step, nexti, stepi, layout asm, layout regs. Můžete použít i jiné debuggery, či grafické nadstavby. * Pokud budete potřebovat přeložit assembler, můžete použít příkaz ''as --32'', či ''gcc -m32 source.s'' (přípony .s a .S jsou automaticky kompilovány pouze assemblerem). * Příkaz ''objcopy'', např. ''objcopy -O binary --only-section=.text --only-section=.rodata prog prog.bin'' * Disassemblovat "holou" binárku můžete příkazem ''objdump -D -b binary -m i386 prog.bin'' * Nástroje ''nc'', ''wget'', ''curl'' ===== Zadání ===== V neděli 3. 12. byl **změněn kód serveru**. Důvod je následující: Během prvního cvičení byla v serveru narychlo opravena chyba, která neočekávaně způsobila změnu pořadí proměnných na zásobníku, což znemožňovalo jednoduché útoky. Aktuální verze serveru opět jednoduché útoky umožňuje. Navíc, protože adresa zásobníku se mezi jednotlivými počítači může lišit, obsahuje nová verze i nápovědu, která vám útok usnadní. Odevzdávací systém má **prodloužen deadline** a testuje vaše útoky proti oběma verzím, takže, pokud máte funkční útok na původní verzi, bude vám fungovat. Kvůli odevzdávacímu systému jsme ještě museli drobně změnit zadání: Soubor **secret.txt byl přesunut z /home do /tmp**. Tato úloha není povinná. Vytvořte útok na [[http://rtime.felk.cvut.cz:8080/|tento webový server]]. Můžete si vybrat ze dvou variant řešení: - Způsobte, že server vypíše na svůj standardní výstup řádku "pwned!" (bez uvozovek) – 4 body. - Zjistěte, co je na serveru v souboru ''/tmp/secret.txt'' – 5 bodů. Do odevzdávacího systému nahrávejte archiv, který bude mimo jiné obsahovat spustitelný soubor ''exploit''. Ten bude spuštěn a jako parametr mu bude předáno URL webového serveru, na který má zaútočit. Např. ''./exploit http://localhost:8080''. V případě 1. varianty zadání nebude na stdout vypsáno nic, u 2. varianty se tam vypíše obsah souboru ''/tmp/secret.txt''. ===== Nápověda ===== * Doporučujeme obstarat si binárku serveru a vyvíjet útok lokálně. Když uspějete lokálně, vyzkoušejte to na [[http://rtime.felk.cvut.cz:8080/|našem serveru]] (smysl má pouze varianta 2) a pak svůj útok nahrajte do upload systému. * Server je 32bitový program, ale to byste určitě zjistili i sami. * Abychom vám hackování trochu ulehčili, podstatné části kódu serveru, zpracovávající HTTP požadavky, nepracují s nulou ukončenými řetězci. * Může se vám hodit nástroj [[http://www.radare.org/r/|radare]], který používá mnoho profesionálů. Základní informace o použití radare jako debuggeru najdete [[https://github.com/radare/radare2/blob/master/doc/intro.md#debugger|zde]] či [[https://radare.gitbooks.io/radare2book/content/introduction/basic_debugger_session.html|zde]].