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

 eXeL@B —› Вопросы новичков —› Обратная операция для imul
Посл.ответ Сообщение

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

Создано: 07 июля 2016 21:57
· Личное сообщение · #1

Всем привет.

Анализирую крекми и столкнулся с неизвестностью. Что для моего уровня норма, только учусь.

Hash = 7DCEE8D7
Code:
  1.  imul    eax, password, 7A69h
  2.  cmp     eax, Hash


Code:
  1. idiv 7DCEE8D7 7A69 = 1071B остаток 20C4
  2. imul 7A69 1071B = 7DCEC813
  3.  
  4. 7DCEE8D7 - 7DCEC813 = 20C4 

Понятное дело, imul знаковое умножение и обратная операция idiv. Но не взлетает.
Перелопатил интернеты, но не нашел как представить обратную операцию.
Подозреваю, что-то со сдвигами при знаковом делении, но я не осилил.

Как найти делитель?
Что почитать?



Ранг: 112.9 (ветеран), 186thx
Активность: 0.090.01
Статус: Участник

Создано: 07 июля 2016 22:37 · Поправил: vden
· Личное сообщение · #2

Почитать можно про idiv в мануалах интела.

TMP_XP ← SRC1 ∗ SRC2 (* Signed multiplication; TMP_XP is a signed integer at twice the width of the SRC1 *)
DEST ← TruncateToOperandSize(TMP_XP);

т.е. из 64 бит произведения остаются младшие 32 бит (по размеру операнда), которые и равны 7DCEE8D7

Например, 0x14F7613F * 0x7A69 = 0xA067DCEE8D7

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

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

Создано: 07 июля 2016 23:43 · Поправил: dzirtt
· Личное сообщение · #3

vden по какой формулы вы нашли 0xA067DCEE8D7 ?
если происходит усечение то скажем 0xB067DCEE8D7 тоже будет верным вариантом?



Ранг: 12.2 (новичок), 11thx
Активность: 0.020
Статус: Участник

Создано: 07 июля 2016 23:48
· Личное сообщение · #4

Умножение в ассемблере и умножение в обычном понимании различаются.
imul x, y, z это умножение y * z по модулю 2^32.
Так что, очевидно, деление не всегда сможет найти сомножитель.
В данном случае нужно воспользоваться методом решений сравнений первой степени.

Так как нод(2^32, 0x7A69) = 1, то сравнение всегда имеет единственное решение равное 0xC72CB5D9 * x
где 0xC72CB5D9 это обратное по умножению к 0x7A69 по модулю 2^32 (находится расширенным алгоритмом Евклида)

Например, hash = 7DCEC813
7DCEC813 * C72CB5D9 = 1071B
Начальным значением было 1071B

Если что, вот тут можно почитать подробнее
https://ru.wikipedia.org/wiki/%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8E

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

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

Создано: 08 июля 2016 00:55
· Личное сообщение · #5

srm60171 спасибо, разобрался.



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

Создано: 08 июля 2016 02:01 · Поправил: dosprog
· Личное сообщение · #6

Проще говоря, если результат умножения не помещается в 32 бита, то старшие (лишние) разряды отбрасываются, с сохранением знака результата.
То есть имеется потеря информации, которую никак не восстановишь.



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

Создано: 09 июля 2016 17:25
· Личное сообщение · #7

srm60171 Vj
Подскажите книгу с разбором операций ассемблера(формулы, математика под ними), одно усечение до 32 бит чего стоит.
Я кончено понял почему остаток от делания и 2^32, но чувствую, что машинные коды таят в себе куда больше таких операций, хочу подготовиться заранее.



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

Создано: 09 июля 2016 17:52
· Личное сообщение · #8

--> Тут <--



Ранг: 12.2 (новичок), 11thx
Активность: 0.020
Статус: Участник

Создано: 10 июля 2016 01:24 · Поправил: srm60171
· Личное сообщение · #9

dzirtt, сами инструкции процессора никакой серьезной математики за собой не имеют. Это в основном относительно примитивные операции. Мануала intel, предложенного выше, более чем достаточно.

Так как разбор программ это все же изучение алгоритма, а не отдельных инструкции, то тут пригодится именно опыт программирования, как не странно. Лучше читать классику - Д. Кнута. (там и алгоритмы и математика)
Потом можно посмотреть литературу по криптографии (базовая есть в Кнуте). Могу порекомендовать "Прикладная криптография" Брюса Шнайера.



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

Создано: 10 июля 2016 16:24
· Личное сообщение · #10

dosprog Я с первого раза понял и взял на заметку. Но мануал всё же сухое изложение, а хочется 'экшена'.

srm60171 Одним глазом читал Кнута, но давно, похоже стоит перечитать. Спасибо.

Нашел хорошую книгу. "Алгоритмические трюки для программистов" Уоррен Генри


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


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