Решение ksydfius - What Is This???

Сложность: 2 – Needs a little brain (or luck)
Платформа: Unspecified/other
Язык: Unspecified/other
Дано: What Is This???

Эта немного необычная задачка, но все-таки ее можно сделать.
Вот только платформа, на которой запускается crackme – чуть-чуть "другая".
Цель - просто найти правильный входной параметр…
Удачи, -ksydfius-

Решение (автор phueghy)
опубликовано 24.12.2012

Как сказал автор, этот crackme "немного необычный". Итак, качаем zip-файл с crackme, а внутри.. JPEG-файл "crackmesde8.jpeg" такого содержания:

image00.jpg

Сначала я пытался найти скрытый смысл в самом изображении (используя графический редактор), но без успеха. Тогда я решил взглянуть на содержимое файла с помощью шестнадцатеричного редактора WinHEX… На первый взгляд, в файле не было никаких аномалий. Погуглив формат JPEG, я решил проверить заголовок файла. Интересное оказалось в конце файла - JPEG должен заканчиваться 2-хбайтовым EOF-тегом 0xFF 0xD9. Но файл заканчивался 0x90 0x16. А EOF-маркер находим по смещению 0x2C06 (смотрите рисунок).

image01.jpg

Ага, кажется, какие-то данные добавлены в конец файла. Гуглим строку "TI83F" и находим, что это сигнатура откомпилированной программы (расширение файла 8xp) для графического программируемого калькулятора TI-83 от Texas Instruments.
Далее, вырезаем данные из crackmesde8.jpeg и создаем новый файл crackme.8xp (смотрите рисунок).

image02.jpg

Скажу честно, в отличии от автора решения у меня никогда не было подобного калькулятора. Поэтому я озаботился поиском декомпилятора для файлов калькулятора. Конечно, ищем только реализации декомпилятора на Python’e. И есть такой (dict_source.py - опкоды команд и help; parse8xp.py - сам декомпилятор).
Декомпилируем crackme.8xp

# -*- coding: utf-8 -*-
import parse8xp
 
print (decompile("crackme.8xp", "crackme8xp.txt"))


Итак, получили исходный код.
A
not protected

Input A
A->B
0->C
While C<100
A+10*tan(A)->A
C+1->C
End
If A=19911.236 Then
Disp "OK"
Else
Disp "NO"
End

Как видим, вся программа - это цикл, который берет входной параметр А, делает вычисления 100 раз и, наконец, сравнивает результат с 19911,236. "Всего лишь" осталось выяснить, какое надо указать значение на входе в эту функцию, чтобы получить необходимый результат.
Функция необратима, поэтому лучший вариант – брутфорс. Вот только незадача, в вычислениях присутствует тригонометрическая функция расчета тангенса. На одном лишь округлении результат будет отличаться между рассчитанным значением на компьютере и значением на калькуляторе. Так что, если где и запускать брутфорс, то только на калькуляторе.

Приведу код брутфорса для калькулятора (взял его с форума crackmes.de, автор [Wizzer]):

1->V
While V < 1000000
0->C
V->A
While C<100
A+10*tan(A)→A
C+1→C
End
If A=19911.236
Then
Disp V
Return
End
V+1->V
End

Итак, выполнив брутфорс, получим необходимое начальное значение A = 18975

Подводим итоги: было интересно узнать о языке TI-Basic, а кому-то написать и оттестировать брутфорс на самом калькуляторе.

Пока не указано иное, содержимое этой страницы распространяется по лицензии Creative Commons Attribution-ShareAlike 3.0 License