R0 CREW

Kaspersky ZeroNights 2015 Crackmes

Смотрю полдня уже. Про алгоритм CAMELLIA не слышал раньше. Пишут, что он AES-подобный. Коли так, то нужен ключ, без него не получится зашифровать свои данные. Понятно, что 32-байтовый ключ тупым перебором не найти. Никаких подсказок касательно того, что может являться ключом, в задании не увидел. Видимо, плохо смотрю, что-то упускаю…

Я думаю сам шифр трогать не надо. Нам ясно дали понять что его не взломать. (большой ключ, стойкий алгоритм)
Но шифр блочный. Нам дают информацию что есть IV (16 байт). Значит используется или CBC или СFB или OFB.
Если СFB, то мы можем зная plaintext менять зашифрованное сообщение (накладывая маску). Я это и называл переворачиванием битов ранее. (bit flipping attack).
Если OFB, то мы можем предсказуемо менять 1 блок сообщения при условии что в последующем будет мусор. То есть будет примерно: <блок нашей зашифрованной информации> <неконтролируемый блок мусора> <блок нашей зашифрованной информации> <неконтролируемый блок мусора> и тд.
Если используется CBC, то примерно как и OFB, но мусорный блок будет до и нужно еще учитывать предпредыдущий блок для выбранного для подмены блока.
Другие “экзотические” режимы я не рассматривал.

Подробности: https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B6%D0%B8%D0%BC_%D1%88%D0%B8%D1%84%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F

Я это все конечно уже пробовал отправлять. Но ничего особого с шифром больше сделать нельзя.

Там обновили описалово:

Привет, sysenter

А пробовал как-либо “эскейпить” мусор, чтобы парсер на него внимание не обращал?

Сори а где его взять что бы посмотреть?

Stanislav Povolotsky, привет:)

Изначально я его просто на новую строку сбрасывал, а свои всегда ничинал с \n
Если считать что символ # - экран (когда в начале строки), то я делаю вот такие варианты:

Возможно, конечно, мне не везет и в мусоре появляется \n.

Еще попробовал вариант как если бы текст после # (без перевода строки) игнорировался.

Да, да, я тоже пробовал эти варианты + пробовал экранировать символом \0, но это не сработало. Оказалось, всё проще: парсер на сервере сам игнорирует мусор (сомневаюсь что такое могло бы встретиться в реальной жизни), но относится менее толерантно к отсутствию пробела после ‘:’.

Hide

Пример регэкспа, по которому из расшифрованного .id выковыриваются данные:

if(/Login: (.{8})\n.*Access: ([^\n]+)\n.*Homedir: ([^\n]+)\n/s)

Блин, вот угадайка то :wink:
Спасибо за помощь, было очень интерестно, что там в итоге хотели авторы :slight_smile:

Угадайка еще та.
По скромным подсчетам я сгенерил примерно 15000 вариантов ответов.
Перестановка полей местами * несколько вариантов значения поля login * все возможные экранирования и паддинги.

точно ) спс

Я выкрячил exe, просто скопировав весь кусок памяти выделенный через VirtualAlloc, что делать с еще двумя кусками памяти, выделяемыми там же я не понял. На экзешники они не похожи. Что это? В одном из них после декода надпись Kernel32 Ntdll.
В общем без дополнительных блоков попробовал запустить и отладить полученный exe , он работает вроде, но окно он так и не запускает, просто через дебри функций идет к TerminateProcess

В принципе я понял уже куда ставить брейкпоинты чтоб просто приататтачиться к уже запущенному окну, но получается что не будет возможности сделать базу данных с пометками, + хочется разобраться с тем, как происходит процесс выковыривания и запуска экзешника изнутри оригинального файла. Меня смущают всякие GetSystemTime и ReadPerformanceCounter, они проверяют что нибудь полезное или просто задают некий стартапинфо?

Еще мне непонятно в какой момент происходит создание нового процесса. После того как содержимое ресурсов подвергается раскодированию происходит обращение к CallWndProc и после этого TerminateProcess() Диалоговое окно появляется как только выполняется Terminate(). Новый процесс ведь запускается не в момент исполнения. И при чем тут CallWndProc? Короче интересуют детали

В одном из них после декода надпись Kernel32 Ntdll. + происходит обращение к CallWndProc ----> Это и есть вызов кода в котором запускается замороженный процесс ЕХЕ который ничего не делает (полученный exe , он работает вроде, но окно он так и не запускает) и дальнейшая правка его заголовков и секций на основе (что делать с еще двумя кусками памяти, выделяемыми там же я не понял) и потом отпускание на исполнение.

По моему мнению:

  1. GetSystemTime и ReadPerformanceCounter задают некий стартапинфо.
  2. Отлаживай процесс в OllyDbg или Immunity Debugger (приатаченному к работающему процессу) а пометки делай в IDA (на сдампенном exe-ке).
  3. Забей на процесс выкавыривания exe-ника.
  4. Подсказка: поставь бряк на API функции чтения из диалогового окна GetWindowTextW и дальше смотри функцию куда она попадет и что делает с введенными данными.

А такой вопрос а как посмотреть куда идет код после вызова CallWndProc, что бы проанализировать что дальше делается?

WndProc параметр укажет адрес.

Dolfin, спасибо, да я уже разобрался куда ставить бряк. Пока что интересно именно волшебство с CallWindowProc, я не знал, что можно таким образом заюзать виндовую процедуру, это какой то взрыв мозга, охота разобраться

Давно разобрано

Может быть но я все равно не врубаюсь. Прочитав статью я понял что callwindowproc должен работать как исполнитель указателя на функцию , который идет первым аргументом. Но в данном случае первым аргументом идет указатель на текст Kernel32 Ntdll , я все CallWindowProc прощелкал и не увидел никакой передачи управления , единственное это ActivateActivationContext и DeactivateActivationContext ну и еще SetError.
Как распакованный код уходит в исполнение мне остается не понятно

Какая-то засада с первым заданием. Перебрал 3 режима, порядок, паддинги с # и без, все разумные логины:

Hide

аdmin, administrator, putin, root, sysop, webmaster

Не помогает, хотя на тестовом стенде с camilla вышеприведенный regexp от Stanislav Povolotsky естественно отрабатывает. В итоге заданием проверяются навыки blackbox-тестирования, а не скилл гугления по “CBC attack”. Что не есть гуд :stuck_out_tongue:

Зато во втором можно было даже не изучать алгоритм хеширования:

Hide

Проверка выполняется в явном виде, функция простая, рассеивание битов минимально, да еще и разрядности хеша и серийника совпадают.
Обозначим пробный серийник как T, а искомый как X. Выполняется проверка hash(T) = hash(X), причем hash(T) xor hash(X) ~= T xor X (между ошибками в битах хеша и серийника есть корреляция).
Значит, вычислив X = hash(X) xor hash(T) xor T, и используя результат как следущее T (инвертируя неверные биты), в несколько итераций получим валидный серийник.

Кстати, думаю, такое уже вполне по зубам SAT-решателям, надо бы их подружить с IDA =)

Даже если не понятно, поставь брейк на начало области на которую указывает lpPrevWndFunc и отпусти. Сработает останов и будешь дальше трейсить.

.text:004014BE                  mov     eax, [ebp+0Ch]
.text:004014C1                  push    0               ; lParam
.text:004014C3                  push    0               ; wParam
.text:004014C5                  push    Msg             ; Msg
.text:004014CB                  push    dword ptr [eax] ; hWnd
.text:004014CD                  push    lpPrevWndFunc   ; lpPrevWndFunc
.text:004014D3                  call    ds:CallWindowProcW
...............................................................................................
.data:00412F4C  ; WNDPROC lpPrevWndFunc
.data:00412F4C  lpPrevWndFunc   dd 5B0000h
...............................................................................................
debug038:005B0000                  pusha; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< break
debug038:005B0001                  call    sub_5B0054
debug038:005B0001  ; ---------------------------------------------------------------------------
debug038:005B0006  aKernel32:
debug038:005B0006                  unicode 0, <kernel32>,0
debug038:005B0018  aNtdll:
debug038:005B0018                  unicode 0, <ntdll>,0

В Msg указатель на образ исполняемого файла который будет запускаться.

.data:00412F58  ; UINT Msg
.data:00412F58  Msg             dd 5F0000h
...............................................................................................
debug040:005F0000                  db  4Dh ; M
debug040:005F0001                  db  5Ah ; Z
debug040:005F0002                  db  90h ; ?

Это не все разумные логины. Всё прощё, по аналогии с другими заданиями.
В остальном, если проходите регулярку, думаю на правильном пути.