gpt4 book ai didi

assembly - 在汇编中隔离整数乘法中的数字?

转载 作者:行者123 更新时间:2023-12-02 20:20:18 24 4
gpt4 key购买 nike

如果我的 EAX 寄存器是 0xFC000000 并且我的 ESI 寄存器是 0xF9FDEFF3,则执行以下操作:

imul esi,eax

将在 ESI 寄存器中存储 0x34000000。乘法的结果是 0xF615F83334000000,但由于程序是 32 位的,因此会将其截断为 0x34000000,并且它是无符号的。现在我的问题是,如果我只有 ESI 寄存器(0xF9FDEFF3)和乘法的截断结果(0x34000000),我将如何找到我的 EAX 寄存器?

提前致谢

注意:EAX 和 ESI 的值是完全随机的,我使用这些数字只是为了展示一个示例。

最佳答案

一般来说,您不能“取消相乘”,但在某些情况下您可以:您知道的数字是奇数的情况。 (当然,在您知道没有溢出的情况下,您可以用普通的旧除法进行取消乘法,但 imul 不会告诉您有关无符号溢出的信息)

奇数有 modular multiplicative inverse modulo 232(实际上是对任何 2 的幂取模,因为 2 的幂在分解时只包含 2,而奇数不包含 2,所以它们的 gcd 将为 1)。

假设我们知道 esi是0xF9FDEFF3,相乘的结果是0x34000000,我们可以这样计算0xF9FDEFF3的逆:(edi是输入)

lea ecx, [edi + 1]
mov eax, 2
mov esi, eax
imul ecx, edi
sub ecx, 1
mov edx, ecx
imul edx, edi
sub esi, edx
imul ecx, esi
mov esi, eax
mov edx, ecx
imul edx, edi
sub esi, edx
mov edx, esi
imul edx, ecx
imul edi, edx
sub eax, edi
imul eax, edx

结果是0x657f413b。现在 0x657f413b * 0x34000000 = 0x149DD93FFC000000,被截断为 0xFC000000。

如果你知道的数字是偶数,你仍然可以解 known * x == output对于 x ,但可能没有解决方案,或者有很多解决方案,但从来没有解决方案。您可以将其视为实际上是 output = (k * x) << d ,其中known = 2dk(k为奇数),那么应该清楚 d输出的较低位最好为零,否则将无解,如果它们为零,则 d x 的高位可以是任何东西。

关于assembly - 在汇编中隔离整数乘法中的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31096430/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com