Откопал такой кусок кода внутри одного крякми: Код (ASM): XOR ECX, ECX XOR EDX, EDX XOR EDI, EDI MOV EAX, STR_LEN ; len of secret str .L1: MOVSX EDI, BYTE PTR [0x403054+ECX] ; buf base + counter ADD EDX, 0x12345678 RCL EDX, 0x1 ADC EDX, EDI ADD EDX, 0x87654321 INC ECX CMP ECX, EAX JNE .L1 CMP EDX, 0xC3B42A38 JNE .ERR_MSG Что оно делает мне понятно, но есть вопрос: какой подход необходимо использовать при обращении подобных алгоритмов? Идти от конца (вычитать из 0xC3B42A38 в цикле 0x87654321 и тд) или же с начала? Прикидывать самому необходимое количество итераций (вместо строки подсунуть 0x00, 0x00, 0x00 ....) и просчитывать зависимости или же наглый брут форс наше все?
Госпадзиии.... Есть плагин под IDA - ponce, как раз для такой цели подходит, использует symbolic execution https://github.com/illera88/Ponce ctfшики его знают наверняка инициализируешь буфер по адресу: 403054 произвольной строкой длины STR_LEN тейнтируешь этот буфер ставишь бряк на условии JNE .ERR_MSG после остановки на бряке, в окне плагина меняешь JNE на JE запускаешь символьный анализ плагин выдает тебе значение которое должен содержать буфер чтобы проверка прошла успешно зы последний билд для ida 6.95, жду под семерку
unc1e, Вы спрашиваете про общий подход к таким циклам ? Логика может быть бесконечно запутанной, обычно ручной разбор невозможен, из за бесчисленных морф конструкций и ветвлений. Но если есть свёртка в виде такого цикла, то он должен разбираться на основе DFG - это функция, операторы которой могут быть найдены просто листая листинг. На основе DF-зависимости. MOVSX EDI, BYTE PTR [0x403054+ECX] v_edi = f(ecx) v_edx = f(edi) v_ecx ++ v_eax: const Jcc eax_ecx ecx - итератор цикла => байтовая индексация f(ecx) => анализ частной логики функции.