tags: windows - crackme
FlareOn Task 1 & 2
Компания FireEye ежегодно проводит онлайн соревнование, под названием FlareOn challenges. На момент написания, он еще активен и будет продолжаться до 5 октября 2018 года. Тематикой текущего года (2018) является Minesweeper World Championship.
В первом задании предлагают найти инвайт код, чтобы попасть на этот чемпионат неофициально.
Скачиваем бинарник, он оказывается java приложением, а значит легко декомпилируется. Запускаем, нас просят ввести регистрационный код.
Пробуем ввести что-нибудь и получаем окно с ошибкой.
Декомпилируем, чтобы посомтреть на код, я использую сайт http://www.javadecompilers.com. Загружаем туда наш jar и там же, онлайн, можно посмотреть исходный код классов.
Судя по исходникам, идет проверка со строкой “GoldenTicket2018@flare-on.com”, что и является верным кодом. Вводим и получаем успешный результат.
Во втором задании, под названием “Ultimate Minesweeper”, нас просят победить в соревновании по сапёру.
Скачиваем и запускаем. Видим практически классического сапёра, с таймером и количеством оставшихся мин.
При проигрыше выдается такое окно и приложение закрывается.
Ясно, что способом “в лоб” мы игру не пройдем, а значит нужно изучить исходный код. Так как приложение написано на C#, мы можем с легкостью его декомпилировать с помощью программы DotPeek или любой другой. Лично мне она нравится, потому что может экспортировать декомплиированный исходник сразу в проект Visual Studio.
Декомпилируем, экспортируем в проект для Visual Studio и открываем его.
Изучаем исходники, дебажим если требуется, и находим функцию, которая вызывается каждый рза, когда мы кликаем по полю.
Как мы видим, в начале идет проверка на то, является ли выбранное поле бомбой и если является приложение закрывается. Если же нет, то идет проверка на то, открыли ли мы все места без бомб (переменная TotalUnrevealedEmptySquares). И если мы открыли их все, то судя по названию (SuccessPopup) мы увидим окно с флагом. Кстати, если посмотреть на эту форму в исходниках и на ее ресурсы, то можно будет убедиться в этом на 100%. В эту форму передается результат функции GetKey, которая подозрительно похожа на функцию, которая генерит какой-то ключ, на основе 3 значений массива RevealedCells.
Из этого можно сделать вывод, что пустых поля всего три. На это же указывает значение переменной TotalUnrevealedEmptySquares в рантайме.
Теперь посмотрим на функцию BombRevealed.
Видим массив под названием MinesPresent. Судя по названию, этот массив содержит информацию о типе поля - пустое/бомба. Перепишем эту функцию так, чтобы в рантайме найти все индексы пустых полей.
В режиме дебага мы увидим 3 набора индексов строка-столбец:
8 29
21 8
29 25
Это и есть поля без бомб. Запускаем заново и выбираем эти поля
После этого появляется окно с флагом
Вверх