Сейчас на форуме: vsv1, NIKOLA, r0lka, johnniewalker (+4 невидимых) |
eXeL@B —› Крэки, обсуждения —› Крякми однако :) |
Посл.ответ | Сообщение |
|
Создано: 27 июля 2019 12:51 · Поправил: BlackCode · Личное сообщение · #1 Всем привет. Попался тут мне интересный крякми. Судя по последнему изменению файла (31 января 2010 г) ему уже почти 9 лет. Задача создать файл ключа, который расшифрует кусок кода вместе с символьной строкой (сообщение об успешном решении). Забегу немного вперед. После анализа кода, а его в крякми не так много, склоняюсь к мнению, что решения не существует. Т.е. алгоритм расшифровки кода не обратим. Возможно я заблуждаюсь, хотя вряд ли. Далее. Крякми консольный, упакован UPX 1.90. При запуске открывается окно созданное GetOpenFileNameA для выбора файла ключа. На OEP в стек записывается 55 байт, которые в последствии должны быть преобразованы для расшифровки кода методом перекторивания. Code:
В стеке это выглядит так Code:
Преобразование этих данных происходит путем перестановки байт относительно второго массива данных размером 192 байта Code:
Данные файла ключа, в процессе модификации первого массива играют роль управляющих перестановкой байт. Размер данных ключа максимально 200 байт. Данные ключа, судя по коду, считываются по 2 байта, т.е. 1 байт управление, 2 байт типа флага (проверяется символ "=") Как пример, 1=2=3=4=5... или отличный от "=" символ, к примеру "+", может получиться что-то в виде этого 1=2+3=4+5+6=... и т.д. После преобразования первого массива, считаться CRC этого массива. Я свернул, алго CRC, ибо он в оригинале в 8 раз больше) Code:
Как видно,что в алго используется константа 0EDB88320h из CRC32Table находящейся в середине таблицы. Далее, значение CRC и данные из первого преобразованного массива перексориваются с данными зашифрованного кода. Code:
В крадце, перексор выглядит так... Code:
После преведенного цикла расшифровки, от полученного кода считается CRC тем же алго, что привел выше. И сравнивается с эталонным CRC 910E3554h. Если CRC совпадает, то происходит переход на расшифрованный код. Code:
Судя по тому, что call у нас на адрес 00401010= 00401000 (базовый) + 16 байт, предпологаю, что в первых 16 байтах содержиться символьная строка типа "Success...." или "Congratulations..." А сам расшифрованный код должен выглядеть пиблизительно так.. Code:
После всего описанного, у меня только одна мысль - брут ключа, но учитвывая факт размера ключа (200 байт) и алгоритм подсчета CRC (в силу простоты алго вероятность коллизии очень высока), задача вряд ли выполнимая вообще. Сам крякми аттачу ниже. Заранее спасибо за советы, соображения. 17f0_27.07.2019_EXELAB.rU.tgz - vcrckme1.exe |
|
Создано: 27 июля 2019 17:48 · Поправил: bartolomeo · Личное сообщение · #2 в файле должны быть байты от 0х21 до 0х38 - и длина не более 100 символов я думаю должна быть какаято подсказка о содержимом на выходе, иначе действительно невозможно | Сообщение посчитали полезным: BlackCode |
|
Создано: 27 июля 2019 21:44 · Личное сообщение · #3 Думаю данный крякми не решаем... если только нет намеренно введенных скрытых уязвимостей, и длинна ключа не маленькая. Ничего особого нет, обычное симметричное шифрование на базе XOR. Пермутация ключа дешифровки зависит от входных данных из файла key.key. Длинна ключа дешифровки 55 символов (последний всегда 0). итого имеем fact(54) = 2,3084369733924138047209274268303e+71 комбинаций, перебрать такое не реально... Восстановить код (208 байт) по crc32, также не реально. Так что, мне кажется это не решаемо (точнее может уйти не реально много времени на брут, а если key.key содержит 100 символов?), Но все это хрень полная, как только станет известна хоть одна составляющая, то все сразу разворачивается. Если станет известно: - содержимое key.key то дальнейшие действия не требуются. - ключ дешифровки, то по нему можно воссоздать key.key - из дешифрованного кода можно восстановить ключ дешифровки, а следовательно и key.key И зачем нужно было так заморачиваться, можно было взять стандартный алго шифрования (RC5, Aes, Des, TEA, XTEA), зашифровать код, а ключ положить в key.key, результат был бы ровно тот же. восстановленный исходник в аттаче, может кто что заметит, чего я пропустил ;) fa2c_27.07.2019_EXELAB.rU.tgz - src.c | Сообщение посчитали полезным: BlackCode |
|
Создано: 27 июля 2019 22:49 · Личное сообщение · #4 |
|
Создано: 27 июля 2019 23:57 · Поправил: UniSoft · Личное сообщение · #5 |
|
Создано: 28 июля 2019 02:31 · Поправил: -=AkaBOSS=- · Личное сообщение · #6 |
|
Создано: 28 июля 2019 05:31 · Личное сообщение · #7 -=AkaBOSS=- пишет: криптоанализ? Да как-то лень глубоко вникать... думаю такой код в реальной жизни не встретишь. -=AkaBOSS=- пишет: один раз по двойным словам - правильным црц ключа второй раз блоками по 0x34 байта - побайтово одним из байтов ключа: 0x00..0x36 без повторов Если ориентируетесь на восстановленный мной исходник, то я там скосячил в ксоре... Code:
| Сообщение посчитали полезным: -=AkaBOSS=- |
|
Создано: 28 июля 2019 07:29 · Поправил: -=AkaBOSS=- · Личное сообщение · #8 UniSoft ну я в основном на перестановки смотрел, так что да - алго читал по исходнику получается, что хэшем ксорится только первый дворд, а дальше используются расшифрованные данные предыдущего блока. первое что думал утром проверить, и обломался: Если в оригинале на первых 16 байтах действительно лежит ASCII строка, то в ней каждый старший бит будет снят. В ключе все байты < 0x36, тоесть два старших бита шифруются только за счёт хэша. Однако что-то так не получается... CC11766E 11001100 00010001 01110110 01101110 EDBF1443 11101101 10111111 00010100 01000011 9EEF1920 10011110 11101111 00011001 00100000 57F1DFB0 01010111 11110001 10111111 10110000 |
|
Создано: 28 июля 2019 08:53 · Личное сообщение · #9 множество коллизий... Code:
Все CRC сходятся но код не верно дешифрован... |
|
Создано: 28 июля 2019 10:20 · Личное сообщение · #10 |
eXeL@B —› Крэки, обсуждения —› Крякми однако :) |