Есть ли другое число которое даст такой же результат умножения?

Тема в разделе "WASM.BEGINNERS", создана пользователем Mikl___, 21 окт 2026 в 07:41.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.297
    На сайте cyberforum.ru в разделе Assembler для начинающих появилось такое сообщение
    1. итак в RAX должно оказаться 0A093F75EA7D1h при умножении какого-то числа на 31337h, содержимое RDX будем игнорировать...
      X⋅31337h=RDX:RAX=0.0000A093F75EA7D1h
      X=0A093F75EA7D1/31337h=34383137h
      34383137h⋅31337h=0A093F75EA7D1h
    2. X⋅31337h=RDX:RAX=1.0000A093F75EA7D1h
      X=1.0000A093F75EA7D1h/31337h=(18446744073709551616+176557370812369)/201527=91535727873090,771881683347640763 получается вещественное число. Нам нужно учесть при умножении вклад дробной части, поэтому сначала 1.0000A093F75EA7D1h нужно сдвинуть на 17 разрядов влево, а после деления на 31337h сдвинуть результат на 17 разрядов вправо, чтобы в RAX оказалось число 0A093F75EA7D1h
      Код (ASM):
      1. mov ecx,31337h
      2. mov rax,0A68051698858B34h
      3. mul rcx; edx=20001h rax=412727EEBD4FA1C42Ch
      4. add rax,10000h;целочисленное округление
      5. shrd rax,rdx,17;rax=0A093F75EA7D1h
      6. shr rdx,17;rdx=1
    3. X⋅31337h=RDX:RAX=2.0000A093F75EA7D1h
      Код (ASM):
      1. mov rax,4D00E1BCCE9D1668h
      2. mul rcx
      3. add rax,10000h
      4. add edx,ecx
      5. shrd rax,rdx,17;rax=0A093F75EA7D1h
      6. shr edx,17;rdx=2
    4. X⋅31337h=RDX:RAX=3.0000A093F75EA7D1h и т.д.
    то есть 34383137h не единственное число в результате умножения на которое в RAX окажется число 0A093F75EA7D1h
     
    Последнее редактирование: 21 окт 2026 в 13:32
  2. Prober

    Prober Member

    Публикаций:
    0
    Регистрация:
    4 дек 2008
    Сообщения:
    57
    Странная задача и ещё более странное решение...

    Дискретная математика так не работает.
    Очевидно же: если один из множителей чётный, то и произведение будет чётным. А вы используете чётный множитель и якобы получаете нечётное произведение.
     
  3. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    604
    Сходу не соображу, но, имхо, направление, в котором надо копать - это взаимная простота (или ее отсуствие) чисел 0x31337, 0x34383137 и 0x10000000000000000
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.297
    Dmitry_Milk,
    31337h=201527=137⋅1471
    0A093F75EA7D1h=176557370812369 = 19⋅137⋅1471⋅46110413 = 876097847⋅201527
    34383137h= 876097847
    если оперировать целыми числами, тогда 34383137h⋅31337h=0A093F75EA7D1h это единственное решение, но я же его обошел :)
     
  5. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    604
    В смысле, в задаче операция imul не обязательная?
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.297
    Dmitry_Milk,
    я использую mul, плюс сдвиги влево вправо, не оговаривалось использование imul с двумя операндами, тогда содержимое rdx бы не менялось
    примерно, так же реализуется деление через умножение
     
  7. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    604
    В общем, если задача формулируется исключительно для целочисленного/fixedpoint представления чисел, то математически она сводится к модульной арифметике по модулю 264.
    Надо найти наибольший общий делитель фиксированного множителя и модуля и проверить целочисленную делимость заданного произведения на этот НОД. При делимости этот НОД и будет количеством возможных ответов.
    В данной задаче НОД от 0x31337 и 264 равен единице, и поскольку произведение уже проверено на делимость предложенным вторым множителем - то этот второй множитель и является единственным решением задачи.

    Хотя не, я не учел представление отрицательных чисел в доп.коде (а тут imul, а не mul). Как соотносятся допкодовые представления 128-битного произведения с модульной арифметикой я сходу не соображу :dntknw:
     
    Mikl___ нравится это.
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.297
    я рассуждал так ― мне в результате умножения 31337h на Х нужно получить число 1.0000A093F75EA7D1h поэтому
    Код (ASM):
    1. ; ищу значение Х
    2. mov ecx,31337h
    3. mov edx,1
    4. mov rax,0A093F75EA7D1h
    5. div rcx; rax=5340528B4C42h
    6. mov rbx,rax
    7. ; проверяю правильность вычисления X
    8. mul rcx; 5340528B4C42h⋅31337h=1.0000A093F75C482Eh маловато будет
    9. inc rbx ; добавим единицу
    10. mov rax,rbx
    11. mul rcx; 5340528B4C43h⋅31337h=1.0000A093F75F5B65h а теперь перебор
    000.jpg
    но 0A093F75C482Eh≠0A093F75EA7D1h≠0A093F75F5B65h почему?
    А потому, что X=1.0000A093F75EA7D1h/31337h=18446920631080363985/201527=91535727873090,771881683347640763
     
    Последнее редактирование: 21 окт 2026 в 15:40
  9. ml64

    ml64 Active Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    146
    Код (ASM):
    1. mov rax,0x31337    // это число константа, никогда не изменяется
    2. mov rcx,0x34383137 // Здесь может быть любое число 8 байт.
    3. imul rax,rcx       // здесь получаем 0xA093F75EA7D1. (умещается в 8 байт)
    4.  
    Арифметически - положительному произведению 0A093F75EA7D1h при известном положительном множителе 31337h всегда будет соответствовать единственный сомножитель 3438 3137h. Примем как преюдицию.
    Тогда предмет доказывания - это переполнение и аномалии инструкции imul.

    Проверим. Начнём с граничного значения. Возьмём наибольший положительный сомножитель:
    31337h * 7FFF FFFF FFFF FFFFh = rdx:0 rax: 7FFF FFFF FFFC ECC9h
    Переполнения не возникает?!
    Двухоперандная форма imul не трогает rdx.

    Двухоперандная форма не обрабатывает переполнение!
    Значит, надо искать здесь
    --- Сообщение объединено, 21 окт 2026 в 17:02 ---
    Я уже подбираюсь к ответу.
    mov rcx,034700000h даёт rax = A13f 9410 0000h
    --- Сообщение объединено, 21 окт 2026 в 17:04 ---
    mov rcx,034500000h даёт rax = A0DD 2D30 0000h
    --- Сообщение объединено, 21 окт 2026 в 17:07 ---
    ...и я вернулся к исходному значению
    --- Сообщение объединено, 21 окт 2026 в 17:21 ---
    --- Сообщение объединено, 21 окт 2026 в 17:49 ---
    Последнее положительное значение до переполнения rcx=29A00F298D85h даёт rax=7FFF FFFF FFFD 4693h
    Двухоперандная форма imul спокойно забивает на знак и идёт дальше:
    rcx=29A00F298D86h даёт rax=8000 0000 0000 59CAh
     

    Вложения:

    • imul.7z
      Размер файла:
      1,3 КБ
      Просмотров:
      7
    Последнее редактирование: 21 окт 2026 в 16:35
  10. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    1.076
    Ваши три числа разные потому, что (2⁶⁴+TARGET) не делится нацело на 0x31337 (частное 91535727873090,77...), и целое X «перескакивает» TARGET — точного X для k=1 не существует. Число из темы получается не из этого деления, а из другого уравнения, учитывающего add rax, 10000h (стандартное округление при сдвиге на 17 бит) и shrd rax, rdx, 17. Именно эта последовательность, а не «подбор остатка», позволяет попасть в TARGET.

    Если вы имеете в виду именно imul rax, rcx из вашей программы — других чисел НЕТ. 0x34383137 — единственное 64-битное значение. А «другие числа» из темы cyberforum получаются только потому, что там используется другой алгоритм (с mul, add rax,10000h, shrd), где младшие 64 бита RAX зависят ещё и от старших 64 бит произведения.

    Инструкция / алгоритмДругие X?
    imul rax, rcx (2 операнда)❌ Нет — единственное 0x34383137
    mul rcx (1 операнд, 128-бит)✅ Да — для каждого k с целым делением
    mul + add rax,10000h + shrd/shr (алгоритм темы)✅ Да — для k=0,1 (и k≥2 с add edx,ecx)
     
  11. ml64

    ml64 Active Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    146
    А знаете что?
    А я не поленился и проверил все граничные условия инструкции imul и вот что получил:

    Условие задачи:
    Код (ASM):
    1.  
    2. xor rdx,rdx
    3. mov rax,31337h
    4. mov rcx,34383137h
    5. imul rax,rcx
    6. mov hiProduct,rdx
    7. mov loProduct,rax
    8. ;rdx=0
    9. mov rax,rdx
    10. Spell64rax 0, szCaption, szRDX
    11. ;rax=0A093 F75E A7D1h
    12. mov rax,loProduct
    13. Spell64rax 0, szCaption, szRAX
    Граничное условие 0 - максимальный положительный множитель:
    Код (ASM):
    1.  
    2. xor rdx,rdx
    3. mov rax,31337h
    4. mov rcx,7FFFFFFFFFFFFFFFh
    5. imul rax,rcx
    6. mov hiProduct,rdx
    7. mov loProduct,rax
    8. ;rdx=0
    9. mov rax,rdx
    10. Spell64rax 0, szCaption, szRDX
    11. ;rax=7FFF FFFF FFFC ECC9h
    12. mov rax,loProduct
    13. Spell64rax 0, szCaption, szRAX
    Граничное условие 1 - максимальный беззнаковый множитель:
    Код (ASM):
    1.  
    2. xor rdx,rdx
    3. mov rax,31337h
    4. mov rcx,0FFFFFFFFFFFFFFFFh
    5. imul rax,rcx
    6. mov hiProduct,rdx
    7. mov loProduct,rax
    8. ;rdx=0
    9. mov rax,rdx
    10. Spell64rax 0, szCaption, szRDX
    11. ;rax=0FFFF FFFF FFFC ECC9h
    12. mov rax,loProduct
    13. Spell64rax 0, szCaption, szRAX
    14.  
    Граничное условие 2 - до переполнения сомножителя:
    Код (ASM):
    1.  
    2. xor rdx,rdx
    3. mov rax,31337h
    4. mov rcx,29A00F298D85h
    5. imul rax,rcx
    6. ;rax=7FFF FFFF FFFD 4693h
    7. Spell64rax 0, szCaption, szRAX
    8.  
    Граничное условие 3 - после переполнения сомножителя:
    Код (ASM):
    1.  
    2. xor rdx,rdx
    3. mov rax,31337h
    4. mov rcx,29A00F298D86h
    5. imul rax,rcx
    6. ;rax=8000 0000 0000 59CAh
    7. Spell64rax 0, szCaption, szRAX
    8.  
    Граничное условие 4 - до переполнения произведения:
    Код (ASM):
    1.  
    2. xor rdx,rdx
    3. mov rax,31337h
    4. mov rcx,53401E531B0Bh
    5. imul rax,rcx
    6. ;rax=0FFFF FFFF FFFD A05Dh
    7. Spell64rax 0, szCaption, szRAX
    8.  
    Граничное условие 5 - после переполнения произведения:
    Код (ASM):
    1.  
    2. xor rdx,rdx
    3. mov rax,31337h
    4. mov rcx,53401E531B0Ch
    5. imul rax,rcx
    6. ;rax=0000 0000 0000 B394h
    7. Spell64rax 0, szCaption, szRAX
    8.  

    Видим, что после переполнения произведения (rcx=53401E531B0Bh) результат rax обнуляется.
    Поэтому предварительный ответ (пока до конечного ответа я не добрался): возможно, числу 31337h повезёт, но в целом такая практика очень fragile, поэтому не рекомендуется к применению
    --- Сообщение объединено, 21 окт 2026 в 18:57 ---
    А в свете сказанного рассмотрим подтекст на сайте cyberforum.ru:
    1) некто пишет в паблик реквест с вопросом, который больше говорит о лени и ЧСВ, чем об интересе.
    2) число 31337h - это eleet на leet-спике, т.е. его троллит "илитарий";
    3) к вопросу подключаются очень мощные люди;
    4) господин под ником UnknownSoldier пишет ответ, что "единственное решение 0x0000000034383137", основываясь на абстрактной математике, а не на работе процессора;
    5) господин под ником NoNaMe (вот это wow, потому что коллаба NoNaMe известна всем, кто хоть раз устанавливал AutoCAD с диска, купленного на книжном рынке) это подтверждает;
    6) ТС пишет в метке (хотя и с ошибкой) и дублирует в сообщении упоминание на некого сайта crackme.one.
    ??? что с этим миром не так?
    --- Сообщение объединено, 21 окт 2026 в 19:10 ---
    ...И ответ: таки да! Числу 31337h повезло:
    rcx=5340 1E53 1B0Ch
    rax=B394
    где-то здесь 31337h
    rcx=5340 1E53 1B0Dh
    rax=3 C6CBh
    Поэтому формально авторитеты правы: при любом другом числе, которое содержит rcx (264―1), мы в rax никогда не получим 0xA093F75EA7D1 - доказано.
    Но это частный случай, а в общем случае утверждение неверно
     

    Вложения:

    • imul.zip
      Размер файла:
      2,2 КБ
      Просмотров:
      4
    Последнее редактирование: 21 окт 2026 в 18:59
  12. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    696
    Адрес:
    Russia
    /offtopic
    Cyberforum чмошный форум, где мудерация сообщений доведена до абсурда. Там толком нельзя ничего писать. Можете так и передать мудераторам - чмошный форум, прокачанный на платное решение задач ЕГЭшников.
     
    Mikl___ и ml64 нравится это.
  13. ml64

    ml64 Active Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    146
    *2 - до переполнения положительного произведения
    *4 - до переполнения беззнакового произведения
     
  14. ml64

    ml64 Active Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    146
    Опять я поторопился. Мой вывод правильный:
    Ход мысли тоже верный:
    повтор через переполнение для множителя 31337h не попадает в первоначальное значение.

    Но итоговое обоснование требует утонения:
    rcx=5340 1E53 1B0Bh + 3438 3137h = 5340 528B 4C42h
    rax=A093 F75C 482Eh
    где-то здесь A093 F75E A7D1h
    rcx=5340 1E53 1B0Bh + 3438 3137h = 5340 528B 4C42h
    rax=A093 F75F 5B65h

    Поэтому формально авторитеты cyberforum.ru правы:
    при любом другом числе, которое содержит rcx (264―1), мы в rax никогда не получим 0xA093F75EA7D1 - доказано.
    Но это частный случай, а в общем случае их утверждение неверно.
    Их математическое обоснование без учёта работы процессора неверно в любом случае.


    Добавил логгер, чтобы цикличность была наглядной.
     

    Вложения:

    • ELEET.zip
      Размер файла:
      6,1 КБ
      Просмотров:
      3