Реверсинг кустарного алгоритма

Тема в разделе "WASM.CRYPTO", создана пользователем VaZoNeZ, 22 фев 2011.

  1. VaZoNeZ

    VaZoNeZ New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    121
    Суть вот в чем, имеем алгоритм, на псевдокоде, он шифрует строку:

    Код (Text):
    1. str="123456"
    2. x (dword) = 1
    3. y (dword) = 2
    4. z (dword) = 3
    5. res (string)
    6. for i:=1 to length(str)
    7. begin
    8.      a = str[i]
    9.      res[i] = a xor (x shr 8)
    10.      x = x + a
    11.      x = x*y + z
    12. end
    Как, зная только результирующую строку, найти оригинальную?

    Я, будучи ниразу не знатоком всего этого, не могу понять, с какой стороны подступиться к этому.
     
  2. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    очевидно надо выполнить все операции в обратном порядке
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Очевидно, надо выполнить все операции в том же порядке. :)

    P.S. Знатоком быть и не надо. Даже дети знают, что xor инволютивен. :)
     
  4. VaZoNeZ

    VaZoNeZ New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    121
    Стоп. После первой итерации мы от результата отнимем Z, поделим на Y и получим сумму X+A, где X и A - нам неизвестны. Как дальше быть то?
     
  5. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    l_inc
    там ключ от входной строки зависит
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    GoldFinch
    Нужный элемент входной строки получается на каждом этапе идентичного преобразования (в том же порядке), поэтому зависимость не является проблемой.
     
  7. VaZoNeZ

    VaZoNeZ New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    121
    [​IMG]
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    VaZoNeZ
    Код (Text):
    1. res = [то, что получилось в res]
    2. x (dword) = 1
    3. y (dword) = 2
    4. z (dword) = 3
    5. str (string)
    6. for i:=1 to length(str)
    7. begin
    8.      str[i] = res[i] xor (x shr 8)
    9.      x = x + str[i]
    10.      x = x*y + z
    11. end
     
  9. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    l_inc
    тестировали?
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    GoldFinch
    Нет. А что там тестировать? Я просто скопировал всё из первого поста.
     
  11. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    VaZoNeZ
    - Известно ли значение x на выходе алгоса #1?
    - Возможно, сам алгоритм шифрации/дешифрации не симметричен. Вы уверены, что алгос в #1
    является именно алгоритмом шифрации а не дешифрации?
    - Где вы такое откопали, если не секрет :) ?
     
  12. VaZoNeZ

    VaZoNeZ New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    121
    1. Нет. Известна только результирующая строка.
    2. Это именно шифрование. Доступа к обратному алгоритму нет.
    3. DDOS Bot Optima.
     
  13. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    VaZoNeZ Алгоритм, предложенный l_inc в #8 вполне рабочий.

    Дело в том, что при шифрации первый символ никогда не шифруется
    Код (Text):
    1. res[0] = str[0] xor (x shr 8) = str[0]
    при заданном х=1 (x shr 8 = 0)

    Поэтому алгоритм дешифрации будет абсолютно такой же.
     
  14. VaZoNeZ

    VaZoNeZ New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2009
    Сообщения:
    121
    x = 1 взято только в качестве примера. Реальное же стартовое значение X - 624h

    Вот файл, скопировано из дизасма http://www.sendspace.com/file/u962rz
     
  15. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    gorodon
    Алгоритм дешифрации такой же не поэтому. Он был бы такой же даже при исходном x >= 0x100.
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    VaZoNeZ
    Если известны числа x, y, z, то как уже заметили - расшифровка тривиальна. Иначе никак.
     
  17. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    l_inc Да, конечно, вы правы...

    VaZoNeZ (x>>8) = x0 = const на первом шаге алгоритма, поэтому

    res[0] = x0 xor str[0] -> str[0] = x0 xor res[0]