Reverse 2015.pptx
- Количество слайдов: 45
Reverse 2015 Разбор задач
Task 1 Operation Jumper
Изучение поля боя ELF => UNIX
Разведка боем Требуется какой-то код…
В атаку! С шашкой! На танк! • Пробуем пробрутить ключ путем написания скрипта-брутфорсера • Ждём… • Ещё ждём… БЕСПОЛЕЗНО!
Привлекаем артиллерию. Используем отладчик GDB
У нас шпионы! При использовании отладчика программа отказывается работать.
Кто стучит?
Работает контрразведка • Используем перехватчик функций в gdb. Создадим в домашнем каталоге файл. gdbinit с вышеуказанным содержимым. Тем самым, вызов ptrace всегда будет возвращать 0.
It works!
Начинаем поиски • Видим функции с интересными названиями
Check. Correct. Code Ставим точку останова на адрес 0 х804890 B и наслаждаемся видами Итого: имеем всегда истинное условие
Невозможное возможно Ставим точку останова на 0 x 0804893 D и вручную модифицируем EIP на 0 x 0804891 F
Победа!
Task 2 Play The Game
Первые шаги Задача первого уровня – просто добежать до выхода. К несчастью, нам в этом мешают стенки…
Help found! • В папке с игрой обнаруживается её логфайл. Это – большая подсказка для нас • Видим в нём строку интересного содержания – Jail Created!
Ищем… • Используя Cheat Engine, нашли нужную строку. • Теперь по ее адресу ищем место, где она используется
Нашли тюрьму! • Нашли процедуру, в которой создается наша тюрьма. Смотрим рядом…
Побег! • Видим какое-то интересное условие… Так и хочется его поменять! • Меняем 05 на 01 - исчезает часть стен • Однако, к выходу нас не подпускает… Проблемка
Если гора не идет к Магомету… • Поисследовав еще немного, находим неподалеку функцию спавна выхода с уровня • Ставим бряк, рестартим, правим аргументы на (4, 2), подбрасывая выход прямо под ноги актору • Уровень пройден
Level Completed!
Level 2 • Имеем: рандомно генерируемое минное поле • Двух весьма недружелюбно настроенных солдат
Думаем • Смотрим лог – ищем по строке Creating level • Вспоминаем, что Jail created выводилась после Creating level в первом случае. • Использование строки Creating level встречается однократно – подозреваем виртуальные функции • Виртуальных вызовов в процедуре на скриншоте нет – значит, она принадлежит некоторому базовому классу CBase. Level и вызывается из производных CLevel 1 и CLevel 2
• Установив бряк на начало процедуры CBase. Level с Creating level, по адресу возврата отлавливаем метод производного класса CLevel 2
Разминирование • • Пролистав процедуру для CLevel 2, находим рядом два вызова rand() в цикле. Предполагаем, что тут генерируются координаты для каждой из мин Пройдя до адреса the_game+2 DC 6, nop’им условный переход jb, таким образом убивая цикл и оставляя на поле всего лишь одну мину
Факир был пьян… • При физическом уничтожении мин игра перестает работать. • Возвращаем стертый условный переход и перезагружаем уровень. Нужно искать другой путь.
Вызываем сапёров • • • Пристально изучаем генерацию мин. Видим, что генерация координат каждой из них идет в цикле до тех пор, пока не выполнится какое-то условие – предполагаем, что это условие отвечает за количество мин в клетке Смотрим далее. Видим вызов оператора new, выделяющего память, и какие-то действия, если память успешно выделена (в ЕАХ не 0) Предполагаем, что это конструктор мины. Интересуемся константой 32 - это код пробела. Меняем её на что-нибудь другое…
Инфракрасное зрение • Мины становятся видны, аккуратно обходя их, идем к солдатам • Нас убивают…
Добиваем гвардию • Возвращаемся к нашему методу создания мин • Ставим бряк после генерации координат новой мины, но перед ее спавном на поле • Меняя сгенерированные координаты, подкидываем две мину часовым под ноги на координаты (79, 10) и (78, 12).
На выход! • Бежим к появившемуся выходу, стараясь не задевать мины
Level Completed!
Level 3 • Теперь всё становится совсем весело: выход есть, а актора нет… • Придется спавнить себя самим!
Все новое – это хорошо забытое старое • Возвращаемся к тщательно забытому нами коду первого уровня с Jail Created • Ищем в нем фрагмент, отвечающий за помещение на уровень актора
Получаем примерный код для спавна актора: pushad //выделение памяти под актора push 20 call [the_game. exe+81 A 8] add esp, 4 //вызов конструктора актора mov ecx, [esi+08] push eax call the_game. exe+1610 //помещение актора на уровень push 0 push eax mov edi, [esi] mov eax, [edi+$1 C] mov ecx, esi call eax popad Теперь надо выделить память под него (Tools->Allocate memory), куда поместить содержимое этого листинга, а также пропатчить функцию создания CLevel 3/
Патчим… • Вот так будет выглядеть код в пропатченом виде
Я тут! • Если все сделано верно – протагонист появляется на уровне • Бежим к выходу
Task Completed!
Task 3 • Попробуем посмотреть список строк в исполняемом файле при помощи утилиты strings
Изучаем Abacab Samantha Adleman vladivostok • Рядом с названием TRegistration. Form видим 4 строки, подозрительно похожих на MD 5 хеш. • Находим их прообразы
• Ищем, где в программе используются эти хеши • Ставим точку останова на чтение первого из них, забиваем поля и нажимаем ОК • Происходит останов
• Изучаем код вокруг области обращающейся к хешу. Видим, что происходит сравнение чего-то с байтами нашего хеша в цикле • Смотрим, с чем происходит сравнение. Это тоже хеш; находим его прообраз: Aaaaab • Сравнивая прообразы хешей, предполагаем, что первая часть ключа - baca
• Вводим первую часть ключа и ставим точку останова на чтение второго хеша • Обращаем внимание, что остановились в том же месте программы, однако так же просто расшифровать хеш, с которым происходит сравнение, не выходит
• Переходим на уровень выше, в вызывающую процедуру • Видим, что там наша процедура вызывается 4 раза • Изучая процндуру, восстанавливаем код полностью: baca - mhan – dnlm – ovki
Победа!
Reverse 2015.pptx