.. _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