
Бинарная эксплуатация и реверс-инжиниринг (из ассемблера в C)
Исследуйте дизассемблирование, эксплуатацию двоичных файлов и reverse-engineering через 10 небольших задач.
В папке для каждого уровня вы найдете:
flag — пароль для следующего уровня
README.md — как найти пароль
source.c — восстановленный исходный код бинарника
dissasembly_notes.md — заметки по ассемблеру
См. subject для подробностей.
За дополнительными возможностями gdb и эксплуатации обращайтесь к предыдущему проекту RainFall.
Сначала скачайте OverRide.iso с 42.
На Mac OSX установите VirtualBox.
В VirtualBox создайте новую VM (нажмите New).
Пройдите все следующие шаги с настройками по умолчанию:
Далее нажмите Settings > Network > Adapter 1 > Attached to: Bridged Adapter.
В настройках нажмите Storage > Справа от «Controller: IDE» находится значок CD с плюсом (добавить оптический привод). Нажмите Add Disk Image и выберите OverRide.iso.
Нажмите Start для запуска VM. После запуска должен отобразиться IP-адрес VM и появится приглашение для входа.
Войдите из отдельного терминала как пользователь level00 с паролем level00.
ssh level00@{VM_IP} -p 4242
Будучи пользователем level00, цель — прочитать пароль для пользователя level01, находящийся в /home/users/level01/.pass. Однако пользователь level00 не имеет прав на чтение этого файла.
В домашней папке пользователя level00 находится бинарник level00 с установленным SUID и владельцем level01.
Это означает, что при выполнении бинарника level00 мы действуем с правами пользователя level01.
Нам нужно найти уязвимость в бинарнике level00 с помощью gdb. Затем использовать эту уязвимость для запуска system("/bin/sh"), открыв оболочку от имени пользователя level01, где у нас будут права на чтение пароля.
cat /home/users/level01/.pass
Затем войдите как пользователь level01.
su level01
Повторите для каждого уровня.
Для каждого уровня мы восстановили исходный source.c, изучив дизассемблирование бинарника в gdb.
0 — Жёстко заданный пароль
1 — Атака Ret2Libc
2 — Атака через форматную строку printf()
3 — Подбор пароля перебором
4 — Переполнение стека через gets() + атака Return-to-libc
5 — Шеллкод в переменной окружения + атака через форматную строку printf()
6 — Хэш-значение, определяемое с помощью gdb
7 — Атака Ret2Libc на незащищённую таблицу данных
8 — Бинарник создаёт резервную копию пароля через симлинк
9 — Ошибка на единицу (off-by-one)
Я написал этот проект в команде с невероятно талантливым @dfinnis.