Сейчас на форуме: vasilevradislav, tyns777, zombi-vadim (+3 невидимых)

 eXeL@B —› Программирование —› Перевернуть функцию...
Посл.ответ Сообщение

Ранг: 28.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 25 июня 2008 00:30
· Личное сообщение · #1

Здравствуйте господа!

есть функция, в которой в цикле производятся следующие операции над числами:

LOOP:
IMUL EBX,EBX,15
ROL EBX,2
MOV EAX, [ECX] ;X1,X2,X3.....
ADD EBX,EAX
INC ECX
DEC EDX
JNZ LOOP

Возможно ли, зная только содержимое EBX на выходе из цикла, вычислить значения (X1, X2, X3...)?

Спасибо.




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 25 июня 2008 01:18
· Личное сообщение · #2

это самопальный хэш. перебором можно вычислить.

-----
Недостаточно только получить знания:надо найти им приложение




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

Создано: 25 июня 2008 09:23 · Поправил: Wyfinger
· Личное сообщение · #3

Уточните, в MOV EAX, [ECX] в EAX помещается 8,16 или 32 байта. Если идет по 2 или по 4 байта, то получается перекрытие, т.е. каждый байт хешируемых данных учавствует в операции несколько раз. Если это так, то обратить функцию будет сложнее, даже не представляю как сделать это.

Если же там побайтовая загрузка, то все просто (в первой программе, которую мне удалось закейгенить было что-то похожее).

Имеем Result (EBX).

1. Чтобы определить последний байт хешируемых данных подбираем значение 0..255, чтобы после Result ror 2 / mod 15h равнялось 0, т.е. чтобы после Result ror 2 результат делился нацело на 15h.
2. Отнимаем от Result выбранное число и повторяем операцию №1, пока в Result не останется число, которое после ror 2 / div 15 будет меньше 255, это число - последний полученный символ и первый в искомой строке (символы получаются в обратном порядке).

Приблизительный код (писал на коленке):

Result := Input;

while Result ror 2 div $15 > 255 do
for i := 0 to 255 do
if Result ror 2 mod $15 = 0 then
begin
Output[] := i;
Result := Result - i;
Break;
end;
Output[] := Result;


Полученную последовательность байтов нужно обернуть.
Также, если предполагается, что хеш вычисляется от читаемой стоки (printable string) можно вабирать байты не из промежутка 0..255 а только из печатных символов.



Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 25 июня 2008 10:05
· Личное сообщение · #4

Wyfinger А для SHA-512 слабо написать ? ;)

-----
My love is very cool girl.




Ранг: 28.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 25 июня 2008 10:29
· Личное сообщение · #5

Rascal пишет:
это самопальный хэш. перебором можно вычислить


перебором - долгие года будет перебираться


Wyfinger пишет:
Уточните, в MOV EAX, [ECX] в EAX помещается 8,16 или 32 байта


в еах помещается 1 байт (к примеру EAX=00000035)

Wyfinger пишет:
Приблизительный код (писал на коленке):


спасибо. попробую

p.s.
и еще, забыл сказать,что после всех вычислений выполняется команда
AND EBX,7FFFFFF




Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 25 июня 2008 10:37
· Личное сообщение · #6

temp пишет:
перебором - долгие года будет перебираться

неправда

-----
invoke OpenFire




Ранг: 28.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 25 июня 2008 10:47
· Личное сообщение · #7

Ice-T пишет:
неправда



а чисел, то X1...X32, т.е. перебирать 32 байта, или я чего-то недопонимаю ?



Ранг: 28.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 25 июня 2008 13:36 · Поправил: temp
· Личное сообщение · #8

Wyfinger пишет:
1. Чтобы определить последний байт хешируемых данных подбираем значение 0..255, чтобы после Result ror 2 / mod 15h равнялось 0, т.е. чтобы после Result ror 2 результат делился нацело на 15h.
2. Отнимаем от Result выбранное число и повторяем операцию №1, пока в Result не останется число, которое после ror 2 / div 15 будет меньше 255, это число - последний полученный символ и первый в искомой строке (символы получаются в обратном порядке).


попробовал, не вышло из-за того, что разложить число нужно на определенное количество байт:

MOV EDX,32
LOOP:
IMUL EBX,EBX,15
ROL EBX,2
MOV EAX, [ECX] ;X1,X2,X3..... [BYTE]
ADD EBX,EAX
INC ECX
DEC EDX
JNZ LOOP



Ранг: 28.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 25 июня 2008 20:21
· Личное сообщение · #9

В общем, как предложил Wyfinger вроде, как не получится, т.к. при работе команды IMUL с отрицательными числами происходит некое "выпадание" битов, т.е. число полученное IMUL не получить обратно командой (I)DIV.
Пример:
mov ebx,0x53849503
imul ebx,ebx,15 ; =0xD9E0393F

mov eax,0xD9E0393F
xor edx,edx
mov ebx,15
idiv ebx ; =0x0A6002B9
Что делать? полная




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 26 июня 2008 00:57
· Личное сообщение · #10

temp пишет:
перебором - долгие года будет перебираться

Зависит от того, что тебе нужно подобрать. Если для 3-4х байт - то не долго. Конкретнее уточни, сколько элементов Х тебе надо получить из хэша

-----
Недостаточно только получить знания:надо найти им приложение




Ранг: 28.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 26 июня 2008 01:38
· Личное сообщение · #11

Rascal пишет:
Конкретнее уточни, сколько элементов Х тебе надо получить из хэша



temp пишет:
MOV EDX,32
LOOP:
IMUL EBX,EBX,15
ROL EBX,2
MOV EAX, [ECX] ;X1,X2,X3..... [BYTE]
ADD EBX,EAX
INC ECX
DEC EDX
JNZ LOOP


32 байта

p.s.
для разбора по методу, предложенному Wyfinger, надо использовать числа типа int64, может кто знает реализацию работы с такими числами на ассемблере, особенно интересует команда ROL/ROR для 64-битных чисел



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

Создано: 26 июня 2008 04:21
· Личное сообщение · #12

temp пишет:
Для разбора по методу, предложенному Wyfinger, надо использовать числа типа int64, может кто знает реализацию работы с такими числами на ассемблере, особенно интересует команда ROL/ROR для 64-битных чисел


Например так, хотя это и не оптимальный вариант, ROL делается аналогично:

// ROR64
// насколько я помню, старшие 32 бита хранятся в EDX
MOV EAX,123456 ; ! load data
MOV EDX,789456
MOV ECX,EAX
AND ECX,3
PUSH ECX ; ! save low of eax
MOV ECX,EDX
AND ECX,3 ; ! get low of edx
SHR EAX,2 ; ! rotate eax
SHL ECX,1E ; ! upp low bits of edx
OR EAX,ECX ; ! shift
POP ECX ; ! load low of eax
SHR EDX,2 ; ! rotate edx
SHL ECX,1E ; ! upp low bits of eax
OR EDX,ECX ; ! shift




Ранг: 51.8 (постоянный), 58thx
Активность: 0.03=0.03
Статус: Участник

Создано: 26 июня 2008 05:01
· Личное сообщение · #13

temp
Возможно ли, зная только содержимое EBX на выходе из цикла, вычислить значения (X1, X2, X3...)?
Результат имеет размер 4 байта, а с учетом
забыл сказать,что после всех вычислений выполняется команда AND EBX,7FFFFFF
еще на 1 бит меньше. Полагаю, всем понятно, что по 4-ём байтам восстановить исходные 32 байта невозможно (во всяком случае, если это произвольные 32 байта без взаимозависимостей). Можно подобрать 32 байта так, чтобы они при преобразовании давали требуемый результат (если в рамках данной задачи такого решения будет достаточно). Поскольку результат имеет размер 31 бит, то в среднем каждая двухмиллиардная комбинация исходных байтов будет давать нужный итог на выходе, а перебрать 2.000.000.000 вариантов - минутное дело, а уж никак не
долгие года будет перебираться



Ранг: 28.1 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 27 июня 2008 11:21 · Поправил: Модератор
· Личное сообщение · #14

В общем подобрал брутом, действительно секунды подбирается

А меня пугало количество перебираемых вариантов 255^32, а оказывается все еще зависит от длины самого подбираемого числа

Всем спасибо, тему можно закрывать, сам пока закрывать не буду, мож у кого комментарии какие есть


 eXeL@B —› Программирование —› Перевернуть функцию...
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


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