Введение в практическую безопасность (2019)/Задания по реверс-инжинирингу и эксплуатации бинарных уязвимостей/Указания

Материал из SecSem Wiki
Перейти к навигации Перейти к поиску

Подключение к заданиям

Большинство заданий реализованы в виде интерактивных программ, реализующий простой текстовый интерфейс. При подключении к серверу будет автоматически запущен экземпляр программы, и вы сможете взаимодействовать с ним точно так же, как если бы вы запустили программу локально.

В описании заданий указаны имя хоста и порт. Чтобы подключиться к ним интерактивно, вы можете воспользоваться любой из следующих программ:

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() # перейти в интерактивный режим

Мелочи

Версия 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).