Вчера Лиза поделилась заданием по системному программированию. Курс начался в сентябре. Я недавно писал про домашку, где нужно было восстановить код на C по ассемблеру. То, что я видел вчера, это еще один левел ап. По сути, это практическое задание по reverse engineering под Linux.
Смотрите, заданием является скомпилированный под Linux исполняемый файл со всеми включенными оптимизациями. Файл можно запускать только на сервере, доступ к которому предоставляется по SSH. Чтобы было весело, это типа бомба и ее нужно обезвредить — передать некий специфичный набор данных на вход, которые приведут к победным сообщениям, а не “взрыву”. Какие данные передавать — надо разобраться, изучив логику “черного ящика”. Догадаться не получится, нужно брать в руки дизассемблер objdump и — вперед. Каждый запуск программы докладывает на сервер о результатах запуска. Каждый неудачный запуск отнимает баллы. Там семь фаз. “Разминировать” нужно строго от простых к сложным. Если споткнулся на фазе Х, то дальше продвигаться бестолку. Там ещё есть всякие секретные уровни, о достижении которых программа докладывает на сервер, и о которых неизвестно ничего, кроме того, что они где-то есть.
На пятой и шестой фазах логика довольно сложная. То есть, она везде сложная, но на пятой и шестой сложная особенно. Во-первых, у нее нет иного смысла, кроме как быть сложной. Ну например, там есть рекурсия и какие-то неочевидные проверки и модификации, которые добавлены просто “от балды”. Во-вторых, методом брутфорса найти ответ или невозможно или очень долго. Технически, конечно, можно было бы (сделать на сях отдельный класс, линковать к нему исполняемый файл и вызывать из него эти функции в цикле, перебирая варианты), но для большинства задач вариантов слишком много, чтобы случайно наткнуться на правильный ответ. Плюс нужно быть осторожным, потому что нужно еще разобраться, не стучит ли программа на сервер в случае таких вызовов (и не отнимает ли баллы).
Binary Ninja немного помогает, но из-за включенной оптимизации врёт, а Angr, Ghidra и подобные врут тоже, причем все по-разному.
Каждый студент получает персонализированное задание со своими функциями. Судя по всему, сгенеренными случайно. То есть, списать не получится.
В общем, Лиза-архитектор (зданий, интерьров) прокачивается. Не могу сказать, что это так пригодится архитектору, но департаменту компьютер сайнс в вузе респект – они молодцы.
Сегодня у нее экзамен по этому предмету. Успехов!
