Order Of Six Angles

Main Logo

A security researcher's blog about reverse-engineering, malware and malware analysis

Home | RU | Translations | Tools | Art | About

18 September 2018

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

Это и есть поля без бомб. Запускаем заново и выбираем эти поля

После этого появляется окно с флагом

Вверх