如果我的EAX寄存器是0xFC000000且我的ESI寄存器是0xF9FDEFF3,那么:
imul esi,eax
将在ESI寄存器中存储0x34000000。 乘法的结果是0xF615F83334000000,但由于程序是32位,它将截断为0x34000000并且它是无符号的。现在我的问题是,如果我只有我的ESI寄存器(0xF9FDEFF3)和乘法的截断结果(0x34000000),我将如何找到我的EAX寄存器?
提前致谢
注意:EAX和ESI的值是完全随机的,我只是用这些数字来表示一个例子。
答案 0 :(得分:4)
一般情况下,你不能“取消乘法”,但在某些情况下你可以:那些知道的数字是奇数的情况。 (当然,也就是你知道没有溢出的情况,所以你可以用一个普通的旧分区来加倍,但是imul
并没有告诉你有关无符号溢出的信息)
奇数有一个modular multiplicative inverse模2 32 (确实模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
,其中已知= 2 d k(k奇数),应该清楚输出的d
低位最好是零或没有解决方案,如果它们为零,那么d
的{{1}}高位可以是任何东西。