Введение в практическую безопасность (2019)/Задания по реверс-инжинирингу и эксплуатации бинарных уязвимостей/Указания
Подключение к заданиям
Большинство заданий реализованы в виде интерактивных программ, реализующий простой текстовый интерфейс. При подключении к серверу будет автоматически запущен экземпляр программы, и вы сможете взаимодействовать с ним точно так же, как если бы вы запустили программу локально.
В описании заданий указаны имя хоста и порт. Чтобы подключиться к ним интерактивно, вы можете воспользоваться любой из следующих программ:
nc $HOST $PORT socat - "TCP:$HOST:$PORT"
В сети BMK_WIFI_FREE нестандартные порты заблокированы, и подключиться к сервисам, к сожалению, не получится.
Написание эксплоита на pwntools
Для написания эксплоитов рекомендуется использовать удобную библиотеку pwntools.
Например, фрагмент экслплоита для задания может выглядеть так:
#!/usr/bin/env python2 from pwn import * import sys if len(sys.argv) == 3: # python2 exploit.py HOST PORT p = remote(sys.argv[1], sys.argv[2]) else: # python2 exploit.py # запуск процесса локально для отладки p = process("./locked_down") libc = ELF("./libc.so.6") print "printf offset", libc.sym["printf"] # подключиться к процессу и поставить breakpoint # на указанный адрес gdb.attach(p, """ b * 0xdeadbeef """) p.recvuntil("> ") # считывать данные, пока не придет строка "> " p.sendline("3") p.recvuntil("Enter password") p.sendline() p.recvuntil("Enter contents") p.send("foobar") p.interactive() # перейти в интерактивный режим
- http://docs.pwntools.com/en/stable/tubes.html
- http://docs.pwntools.com/en/stable/tubes.html#pwnlib.tubes.tube.tube.recvuntil
- http://docs.pwntools.com/en/stable/util/packing.html#module-pwnlib.util.packing
- http://docs.pwntools.com/en/stable/elf/elf.html#example-usage
Мелочи
Версия libc
Ваша версия libc может не совпадать с той, которая используется на сервере, что сказывается на смещениях функций. Чтобы вам не приходилось перебирать возможные версии libc популярных дистрибутивов, вместе с заданием приложены бинари libc.
Вообще отлаживать с корректной версией libc может быть необязательно: если отличия только в смещениях функций, то достаточно лишь аккуратно заменить их перед запуском на сервере. Но иногда отличия более серьезные: например, если вы используете ROP-гаджеты из libc.
Запустить бинарь с чужой версией libc можно таким способом:
LD_TRACE_LOADED_OBJECTS=1 LD_LIBRARY_PATH=. ./locked_down # чтобы убедиться, что подгрузилась правильная библиотека LD_LIBRARY_PATH=. ./locked_down
Однако если ваша родная версия libc слишком новая или слишком старая, из-за различий в ld.so это может не сработать, и программа упадет на запуске.
В таком случае можно порекомендовать запускать всё в виртуалке или докере с приблизительно такой же версией
дистрибутива (ubuntu:16.04
).