Laboratorium 6 – Wstęp do eksploitacji binarnej

Data: 5.11.2019, 31.10.2019

Narzędzia

Przydatne linki

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