.. _pwn1: ================================================ Laboratorium 6 -- WstÄp do eksploitacji binarnej ================================================ Data: 5.11.2019, 31.10.2019 .. toctree:: .. contents:: NarzÄdzia ========= - gdb (debugger) - Python 3 - biblioteka pwntools: https://github.com/Gallopsled/pwntools Przydatne linki =============== - Dokumentacja biblioteki pwntools: http://docs.pwntools.com/en/stable/ - Strona z ciekawymi zadaniami z kategorii eksploitacji binarnej: https://pwnable.kr/ ObsĹuga gdb =========== :ref:`gdb` .. _pwntools: Biblioteka pwntools =================== Instalacja ---------- Obecnie trwa migracja na python 3, jednak zalecamy uĹźywanie takiej wersji:: python3 -m venv env source env/bin/activate python3 -m pip install --upgrade git+https://github.com/Gallopsled/pwntools.git@dev3 ObsĹuga ------- Importowanie w skrypcie (importuje **wszystko**, w tym inne moduĹy, ale dziÄki temu wystarczy ta jedna linijka):: from pwn import * Konstrukcja obiektĂłw typu ``tube`` (wspĂłlny interfejs do komunikacji): - ``process``: tworzy nowy proces - ``remote``: tworzy poĹÄ czenie TCP lub UDP NajwaĹźniejsze metody w.w. obiektĂłw: - ``recv(n)``: odbiera ``n`` (domyĹlnie 4096) bajtĂłw (lub mniej jeĹli niedostÄpne) - ``recvn(n)``: jak wyĹźej, ale odbiera dokĹadnie ``n`` bajtĂłw - ``recvuntil(s)``: odbiera bajty aĹź do ciÄ gu ``s`` - ``recvline()``: odbiera bajty do znaku nowej lini - ``clean()``: w pÄtli odbiera dane i Ĺpi (domyĹlnie 0.05 sekundy), wraca jeĹli w trakcie ostatniego obrotu pÄtli nie przyszĹy Ĺźadne dane - ``send(s)``: wysyĹa ciÄ g bajtĂłw ``s`` - ``interactive()``: uruchamia interaktywnÄ sesjÄ: wszystko co napiszyemy zostanie wysĹane, wszystko co przeĹle druga strona zostanie wypisane na terminal - ``close()``: zamyka kanaĹ komunikacji Dodatkowe przydatne funkcjie: - ``p64(x)``: pakuje liczbÄ ``x`` jako ciÄ g 8 bajtĂłw little-endian - ``p32, p16, p8``: jak wyĹźej, odpowiednio 4, 2 i 1 bajt - ``u64(x)``: odwrotnoĹÄ ``p64`` - rozpakowuje 8 bajtĂłw w liczbÄ - ``u32, u16, u8``: analogicznie - ``gdb.attach(r)``: jeĹli ``r`` to obiekt odpowiadajÄ cy lokelnemu procesowi, tworzy nowy terminal/okno, uruchamia w nim gdb i podĹÄ cza siÄ do procesu - ``context.log_level``: poziom logowania; czasami przydatne jest ustawienie go na ``"DEBUG"``, co spowoduje logowanie wszystkich przychodzÄ cych i wychodzÄ cych danych (z/do procesu, gniazda TCP, itd.) - ``cyclic(l, n=N)``: zwraca ciÄ g dĹugoĹci ``l``, w ktĂłrym kaĹźdy podciÄ g dĹugoĹci ``N`` jest unikalny (ciÄ g De Bruijna) - ``cyclic_find(x, n=N)``: znajduje offset podciÄ gu ``x`` w ciÄ gu wygenerowanym przez funkcjÄ powyĹźej (``N`` ma takie samo znaczenie) - ``info(s), debug(s), error(s)``: loguje napis ``s``, w zaleĹźnoĹci od ustawionego poziomu w danym momencie (np. jeĹli jest ustawiony na ``"INFO"``, to ``debug`` nic nie wypisze); ``error`` dodatkowo rzuca wyjÄ tkiem