Правильный подход для решения подобных крякми

Тема в разделе "WASM.BEGINNERS", создана пользователем unc1e, 16 окт 2017.

  1. unc1e

    unc1e Active Member

    Публикаций:
    2
    Регистрация:
    28 июл 2017
    Сообщения:
    287
    Откопал такой кусок кода внутри одного крякми:
    Код (ASM):
    1. XOR ECX, ECX
    2. XOR EDX, EDX
    3. XOR EDI, EDI
    4. MOV EAX, STR_LEN ; len of secret str
    5.  
    6. .L1:
    7. MOVSX EDI, BYTE PTR [0x403054+ECX] ; buf base + counter
    8. ADD EDX, 0x12345678
    9. RCL EDX, 0x1
    10. ADC EDX, EDI
    11. ADD EDX, 0x87654321
    12. INC ECX
    13. CMP ECX, EAX
    14. JNE .L1
    15.  
    16. CMP EDX, 0xC3B42A38
    17. JNE .ERR_MSG

    Что оно делает мне понятно, но есть вопрос: какой подход необходимо использовать при обращении подобных алгоритмов? Идти от конца (вычитать из 0xC3B42A38 в цикле 0x87654321 и тд) или же с начала? Прикидывать самому необходимое количество итераций (вместо строки подсунуть 0x00, 0x00, 0x00 ....) и просчитывать зависимости или же наглый брут форс наше все?
     
  2. vx1d

    vx1d Member

    Публикаций:
    0
    Регистрация:
    13 дек 2016
    Сообщения:
    118
    Госпадзиии....
    Есть плагин под IDA - ponce, как раз для такой цели подходит, использует symbolic execution https://github.com/illera88/Ponce
    ctfшики его знают наверняка
    инициализируешь буфер по адресу: 403054 произвольной строкой длины STR_LEN
    тейнтируешь этот буфер
    ставишь бряк на условии JNE .ERR_MSG
    после остановки на бряке, в окне плагина меняешь JNE на JE
    запускаешь символьный анализ
    плагин выдает тебе значение которое должен содержать буфер чтобы проверка прошла успешно
    зы
    последний билд для ida 6.95, жду под семерку
     
    _edge нравится это.
  3. unc1e

    unc1e Active Member

    Публикаций:
    2
    Регистрация:
    28 июл 2017
    Сообщения:
    287
    спасибо, попробую
     
  4. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    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) => анализ частной логики функции.
     
    unc1e нравится это.