Сейчас на форуме: Rio, johnniewalker, vsv1, Magister Yoda, Kybyx (+6 невидимых)

 eXeL@B —› Крэки, обсуждения —› Реверс алго
. 1 . 2 . >>
Посл.ответ Сообщение


Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 25 августа 2011 09:42
· Личное сообщение · #1

Нужна помощь в реверсе алго. Есть выражение
v18 := 5257 * ((67108865 * v17) mod $3FFFC);
Как получить V17? Чем-то мне напомнило рса, но пока не проверял эту мысль.



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 25 августа 2011 09:51
· Личное сообщение · #2

Nightshade пишет:
Чем-то мне напомнило рса, но пока не проверял эту мысль.

у РСА возведение в степень экспоненты а не умножение

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 25 августа 2011 09:56 · Поправил: Nightshade
· Личное сообщение · #3

Да уже посмотрел.
пока понял такую вещь $3FFFC =262140
67108865/262140 = 256
Делится нацело значит остатка не даст.
И
262140/ 5257 =49 - тоже нацело



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 25 августа 2011 10:03 · Поправил: VodoleY
· Личное сообщение · #4

v18 := 5257 * ( v17) не?
изначально эта формула подразумевает ща счет МОД множественные решения

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....





Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 25 августа 2011 10:07 · Поправил: Nightshade
· Личное сообщение · #5

Похоже на то.
v17 - word. Значит меньше $3FFFC
Отсюда v17 mod $3FFFC =v17
Нет не получается
v17 = $7802
($7802*67108865 ) mod $3FFFC = $8002




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 25 августа 2011 10:21
· Личное сообщение · #6

Во-первых, 67108865 делится на 262140 вполне себе с остатком.
Во-вторых, полагаю, что текущая форма записи не полная, ибо как минимум умножение тоже происходит по модулю.
В-третьих, расширенный алгоритм Евклида вполне должен это решать.




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 25 августа 2011 10:24 · Поправил: Nightshade
· Личное сообщение · #7

Ненавижу флудерастов вроде промикса.
Вообщем
(x * 67108865)mod $3FFFC =y
x=y-$800
такая бодяга получается. Видно мы что-то не проходили про mod...
Мля меня похакал виндозный калькулятор-он не показывает остаток в программерском виде



Ранг: 37.1 (посетитель), 11thx
Активность: 0.030
Статус: Участник

Создано: 25 августа 2011 10:27 · Поправил: Promix_17
· Личное сообщение · #8

Вроде как: v17=((v18/(5257*5))*35293 mod 0x3FFFC)




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 25 августа 2011 10:48
· Личное сообщение · #9

v18 := 5257 * ((67108865 * v17) mod $3FFFC);
v17= 30722 v18 = 172271890
((172271890/5257) * 35293 mod $3fffc) /5 = 50414
v17 - word v18 -dword



Ранг: 37.1 (посетитель), 11thx
Активность: 0.030
Статус: Участник

Создано: 25 августа 2011 10:57 · Поправил: Promix_17
· Личное сообщение · #10

Ясен пень, что в 32 бита обратная формула не влезет! Считать, правильно научились бы, а потом уже претензии предъявляли бы!




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 25 августа 2011 11:00
· Личное сообщение · #11

Ну покажи как в 32 битах это посчитать



Ранг: 37.1 (посетитель), 11thx
Активность: 0.030
Статус: Участник

Создано: 25 августа 2011 11:16 · Поправил: Promix_17
· Личное сообщение · #12

Code:
  1. class BigIntenger { ... };
  2. ...
  3. BigIntenger v17, v18;
  4. v17=(((v18/(5257*5))*35293)%0x3FFFC);

А, вообще, однозначного решения данного уравнения не существует - есть целых 5 решений в кольце 0x3FFFC по известному v18:

v17=(((v18/(5257*5))*35293) mod 0x3FFFC)+(k*0x3FFFC/5) mod 0x3FFFC,где k=0,1,2,3,4



Ранг: 6.0 (гость), 25thx
Активность: 0.010
Статус: Участник

Создано: 25 августа 2011 11:55
· Личное сообщение · #13

Я правильно понял.
Упрощаем выражение.
v18 = 5257 * ((67108865 * v17) % 0x3FFFC)
v18 = 5257 * ((67108865 % 0x3FFFC)* (v17 % 0x3FFFC))
v18 = 5388425 * (v17 % 0x3FFFC)

Отсюда, вариант решения
v17 = (v18 / 5388425) +0x3FFFC
или
v17 = ((v18 / 5388425) +0x3FFFC) % 0x3FFFC




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 25 августа 2011 14:22
· Личное сообщение · #14

Code:
  1. 02F7EC46    8B45 EC         MOV EAX,DWORD PTR SS:[EBP-14]
  2. 02F7EC49    69C0 01000004   IMUL EAX,EAX,4000001
  3. 02F7EC4F    33D2            XOR EDX,EDX
  4. 02F7EC51    B9 FCFF0300     MOV ECX,3FFFC
  5. 02F7EC56    F7F1            DIV ECX
  6. 02F7EC58    8A06            MOV AL,BYTE PTR DS:[ESI]
  7. 02F7EC5A    0FB64E 01       MOVZX ECX,BYTE PTR DS:[ESI+1]
  8. 02F7EC5E    34 9D           XOR AL,9D
  9. 02F7EC60    0FB6C0          MOVZX EAX,AL
  10. 02F7EC63    69D2 89140000   IMUL EDX,EDX,1489
  11. 02F7EC69    8955 EC         MOV DWORD PTR SS:[EBP-14],EDX
  12.  

Не получается по этим формулам найти




Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 25 августа 2011 14:39
· Личное сообщение · #15

A так?

V17:= (v18*$3FFFC)/(5257*67108865)

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 25 августа 2011 14:44
· Личное сообщение · #16

V17:= (v18*$3FFFC)/(5257*67108865) - по этой формуле всегда 0
Все должно влезать в 32 бита




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 25 августа 2011 14:51
· Личное сообщение · #17

У вас умножение происходит в кольце. В кольце нет операции деления, есть понятие обратного элемента и умножения на него. И ищется он через РАЕ, про который я выше написал. Забудьте про деление.




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 25 августа 2011 14:56
· Личное сообщение · #18

А можно тоже самое только простым языком?



Ранг: 52.1 (постоянный), 1thx
Активность: 0.020
Статус: Участник

Создано: 25 августа 2011 15:03 · Поправил: Wyfinger
· Личное сообщение · #19

Никакой формулы-решения не может быть, это алгоритм.
Обратите внимание. Ваша задача - решение сравнений (67108865 * v17) mod $3FFFC
Кроме этого заметьте, что 67108865 > $3FFFC, поэтому сократим 67108865 до 1025 (1025 = 67108865 mod $3FFFC).
Задача - найти x в выражении (1025 * x) mod $3FFFC
О решении задачи можно почитать в разделе Решение сравнений на Википедии.




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 25 августа 2011 15:17
· Личное сообщение · #20

Это функция из шифровки траффика клиент-сервер. Поскольку сервер это расшифровывает -формула решение есть



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 25 августа 2011 15:42 · Поправил: Av0id
· Личное сообщение · #21

если честно, то похоже на elgamal, а именно подпись




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 25 августа 2011 17:52
· Личное сообщение · #22

(x*4000000 +x) mod (40000-4)=y
нельзя это разложить как-то красиво? Может компилятор оптимизировал операции?
Заметил что последний байт х и у всегда одиннаковый.
изначально х из 2 байт
call _rand_0
movzx eax, ax
mov [ebp+var_14], eax



Ранг: 52.1 (постоянный), 1thx
Активность: 0.020
Статус: Участник

Создано: 25 августа 2011 18:14 · Поправил: Wyfinger
· Личное сообщение · #23

Вы точно прочитали статью на Википедии?

Я, конечно, не спец в криптографии и математике, но, насколько я понимаю уравнение
a*x mod b = с
нельзя решить простым выражением.

Нужно взять НОД(с, a) пусть он равен d
поделить a, b, c на d (a1=a/d, b1=b/d, c1=c/d)
получим уравнение
a1*x mod b1 = c

Далее нужно найти обратное a1 по модулю b1 (сделать это можно теоремы Эйлера, алгоритма Евклида, в помощь), пусть это будет g.

Теперь решение находится умножением полученного уравнение на g.

Это мой неграмотный перевод указанного выше раздела из статьи на википедии.




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 25 августа 2011 18:57
· Личное сообщение · #24

Прочитал, но нифига не понял.
теоремы Эйлера, алгоритма Евклида и сферический конь для меня одиннаковые понятия



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 26 августа 2011 01:23
· Личное сообщение · #25

Поскольку сервер это расшифровывает -формула решение есть
Заморочил ты всем голову. Нет решения для той функции, для которой ты привел код.
Поделив на 1489 получим остаток, который должен получится из 32-битного слова при делении на 0x3FFFC
Очевидно, что получаем неоднозначное соответствие. Но это я потом сообразил. Сначала пытался получить формулу . Поняв, что не получится, вбил команды в Олли и стал гонять.
А формула для остатка ПРОСТАЯ!!! Для диапазона v17=0-0x3FFFB такая : (v17%0x40)*0x400+v17
Если обозначить остаток через О, то v17=O-(O%0x40)*0x400 Надо только учесть, что O не попадает в диапазоны 1-3FF и некоторые другие. Для больших чисел можно легко посчитать коллизию.
50E221 и A271 -> остаток 16671 и т.д.
Вот так!!! Надо будет прогнать все числа и посмотреть точнее, что там получается.

| Сообщение посчитали полезным: Nightshade

Ранг: 6.0 (гость), 25thx
Активность: 0.010
Статус: Участник

Создано: 26 августа 2011 02:28
· Личное сообщение · #26

Archer совершенно прав, необходимо найти обратное по модулю число.
Так как используется только 32 бита, то имеем выражение
X = (67108865 * v17) % 2**32
Надо найти число обратное по модулю (Modular multiplicative inverse) константе 67108865
A = 67108865 % 2**32
A * A**(-1) = (67108865 * A**(-1)) % 2**32
1 = (67108865 * A**(-1)) % 2**32
Используем расширенный алгоритм Евклида (а можно через сайт wolfram.com) найдем его:
A**(-1) = 4227858433
Проверка - (4227858433 * 67108865) % 2*32 = 1

Теперь
кодируем так X = (67108865 * v17) % 2**32
а раскодируем так v17 = (4227858433 * X) % 2**32

Что такое должно получиться
кодируем v18 := 5257 * (((67108865 * v17) % 2**32) % 0x3FFFC);
раскодируем v18 = v18/5257
v17 = (((4227858433 * v18) % 2**32) % 0x3FFFC)
Например
v17 = ['H','E','L','L','O']
кодируем v18 = ['0296E688', '01A03CED', '03DFC8AC', '03DFC8AC', '04D67247']
раскодируем v17= ['00000048', '00000045', '0000004C', '0000004C', '0000004F']



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 26 августа 2011 09:16
· Личное сообщение · #27

Fedonin Это все здорово. Но для байтов по моей формуле быстрее и проще.
Только вряд ли там каждый байт кодируется 4-мя. Ну правда можно кодировать 2 байта и даже почти 18 бит, только ТС не сказал про разрядность. Говорил только про 32 бита. А где?



Ранг: 37.1 (посетитель), 11thx
Активность: 0.030
Статус: Участник

Создано: 26 августа 2011 10:59
· Личное сообщение · #28

Я не понимаю, чем вам моя формула не нравится? А именно v17=(((v18/(5257*5))*35293) mod 0x3FFFC)+(k*0x3FFFC/5) mod 0x3FFFC, где k=0,1,2,3,4. Если кодируются небольшие числа (символы), то берём k=0. Если хотите, сейчас напишу решение.



Ранг: 37.1 (посетитель), 11thx
Активность: 0.030
Статус: Участник

Создано: 26 августа 2011 11:20
· Личное сообщение · #29

Пусть х=v18/5257, y=v17. Получается:
x=67108865*y mod $3FFFC
x=1025*y mod 262140
Т.к. НОД(1025,262140)=5, то обратного элемента к 1025 по модулю 262140 не существует
=> данное сравнение имеет решения тогда и только тогда, когда х делится на НОД(1025,262140)=5
Количество решений по модулю 262140 равно 5.Тогда,
x=1025*y mod 262140 =>
х/5=205*y mod 52428
Обратный элемент к 205 по модулю 52428 равен 35293, тогда
35293*x/5=35293*205*y mod 52428
y=35293*x/5 mod 52428 - частное решение
v17=(((v18/(5257*5))*35293) mod 52428)+(k*52428) mod 0x3FFFC, где k=0,1,2,3,4 - общее решение




Ранг: 241.9 (наставник), 107thx
Активность: 0.140.01
Статус: Участник

Создано: 26 августа 2011 11:44
· Личное сообщение · #30

Promix_17 Твоя формула не дает нужный результат.
Формула Тундры на 2 тестовых значениях выдала нужный результат. Не знаю насколько она правильна, но факт остается таким. Формулу Fedonin не пробовал. tundra37 спасибо. Если будут еще умные мысли - пишите. Пока топ закрывать не буду, поскольку плохо знаю вышку и мало ли в формуле есть ошибка.


. 1 . 2 . >>
 eXeL@B —› Крэки, обсуждения —› Реверс алго
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати