Сейчас на форуме: _MBK_, Adler (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Crackme от ARTeam
Посл.ответ Сообщение

Ранг: 0.7 (гость), 4thx
Активность: 0=0
Статус: Участник

Создано: 09 июля 2011 06:19
· Личное сообщение · #1

Столкнулся с проблемой:
ссылка
Чтобы Crackme заработал, нужен файл key.file, размером 19 байт.
Проверка содержимого этого файла на корректность производится в процедуре, находящейся по адресу 4010F6
Сама процедура:
Code:
  1. @crackme0_004010F6:                          ;<= Procedure Start
  2.  
  3.         PUSH EBP
  4.         MOV EBP,ESP
  5.         PUSH ESI
  6.         PUSH EDI
  7.         XOR EAX,EAX
  8.         MOV EDI,[ARG.1]
  9.         MOV ESI,EDI
  10.         ADD ESI,[ARG.2]
  11.         JMP @crackme0_00401113
  12.  
  13. @crackme0_00401107:
  14.  
  15.         MOVZX ECX,BYTE PTR DS:[EDI]
  16.         ADD EAX,ECX
  17.         ROR EAX,8
  18.         XOR EAX,07Bh
  19.         INC EDI
  20.  
  21. @crackme0_00401113:
  22.  
  23.         CMP EDI,ESI
  24.         JNZ @crackme0_00401107
  25.         POP EDI
  26.         POP ESI
  27.         LEAVE
  28.         RETN 8                               ;<= Procedure End


где ARG.1 - Строка из файла
ARG.2 - ее длина
Делал следующее (в обратном порядке)
Например, строка в файле "aaaaaaaaaaaaaaaaaaa":
Для нее вычисленный хеш равен 0DECC6F7Dh
1. 0DECC6F7Dh ------> xor 7B ------>0DECC6F06h
2. 0DECC6F06h ------> ROL 8 ------> 0CC6F06DEh
3. Из числа 0CC6F06DEh нужно получить число 0CC6F067Dh : 0CC6F06DEh-61h=0CC6F067Dh (т.к. код буквы "a" равен 61h)

В крэкми проверяется значение хеша, оно должно быть равным 0AAE23242h

Вопрос
Возможно ли отреверсить строку, или тут кроме брута ничего не сделаешь?
Буду рад помощи, а то окончательно запутался, ибо брутить 19 символов - бред
PS патчить НЕЛЬЗЯ



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

Создано: 09 июля 2011 08:53 · Поправил: VodoleY
· Личное сообщение · #2

0xf0rd как мне кажеца, тут вся соль в ROR EAX,8. Так как это размерность байта, то у тебя по факту в конечном хеше каждый байт это (a xor 7b)+(a xor 7b) ... тебе надо посчитать только сколько раз каждая позиция в конце раз складывалась и ксорилась. и если я не ошибаюсь 7б тоже не просто так, она недолжна давать сумме вылазить за FF

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




Ранг: 0.7 (гость), 4thx
Активность: 0=0
Статус: Участник

Создано: 09 июля 2011 11:12 · Поправил: 0xf0rd
· Личное сообщение · #3

Оказывается, данный крекми был решен еще в далеком 2005 году)))
Что бы мы делали без великого Гугла ?
--> Link <--
Смысл там такой:
Если на вход процедуры подавать строку из 8 нулевых байт, то тогда в EAX будет тоже 0!
Следовательно, в файле будут значащими только последние 4 байта))



Ранг: 590.4 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 09 июля 2011 13:14 · Поправил: r_e
· Личное сообщение · #4

Если сообщение больше чем длина хеша берется произвольная последовательность размером sizeof(Msg) - sizeof(Hash) и вычисляется "начальное состояние". Остаток брутится или вычисляется реверсом.
При неудаче - генерим новый заголовок и повторяем.

Это справедливо для многих хешей. Чем меньше хеш дает коллизий - тем меньше итераций нужно.

-----
старый пень




Ранг: 0.7 (гость), 4thx
Активность: 0=0
Статус: Участник

Создано: 09 июля 2011 13:37
· Личное сообщение · #5

Так как нам на выходе нужно получить 0AAE23242h, то
(байты справа налево):
1-й байт будет равен АА-7B=2F
2-й байт будет равен E2-7B=67
3-й байт будет равен 32
4-й байт будет равен 42 xor 7B=39

Итого, строка будет состоять из пятнадцати байт со значением "0" и dword'a 2f673239


 eXeL@B —› Вопросы новичков —› Crackme от ARTeam
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати