Laboratorium 6 – Wstęp do eksploitacji binarnej¶
Data: 5.11.2019, 31.10.2019
Treść
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/
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 procesremote
: tworzy połączenie TCP lub UDP
Najważniejsze metody w.w. obiektów:
recv(n)
: odbieran
(domyślnie 4096) bajtów (lub mniej jeśli niedostępne)recvn(n)
: jak wyżej, ale odbiera dokładnien
bajtówrecvuntil(s)
: odbiera bajty aż do ciągus
recvline()
: odbiera bajty do znaku nowej liniclean()
: 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 danesend(s)
: wysyła ciąg bajtóws
interactive()
: uruchamia interaktywną sesję: wszystko co napiszyemy zostanie wysłane, wszystko co prześle druga strona zostanie wypisane na terminalclose()
: zamyka kanał komunikacji
Dodatkowe przydatne funkcjie:
p64(x)
: pakuje liczbęx
jako ciąg 8 bajtów little-endianp32, p16, p8
: jak wyżej, odpowiednio 4, 2 i 1 bajtu64(x)
: odwrotnośćp64
- rozpakowuje 8 bajtów w liczbęu32, u16, u8
: analogiczniegdb.attach(r)
: jeślir
to obiekt odpowiadający lokelnemu procesowi, tworzy nowy terminal/okno, uruchamia w nim gdb i podłącza się do procesucontext.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ścil
, w którym każdy podciąg długościN
jest unikalny (ciąg De Bruijna)cyclic_find(x, n=N)
: znajduje offset podciągux
w ciągu wygenerowanym przez funkcję powyżej (N
ma takie samo znaczenie)info(s), debug(s), error(s)
: loguje napiss
, w zależności od ustawionego poziomu w danym momencie (np. jeśli jest ustawiony na"INFO"
, todebug
nic nie wypisze);error
dodatkowo rzuca wyjątkiem