【问题标题】:Reverse function反向功能
【发布时间】:2016-05-11 11:30:47
【问题描述】:

我一直在尝试反转一个看起来很简单的函数。 该功能以汇编形式呈现: (参数加载到 AX 中)

AND AX, 0xFFFE (round down to even number)
MUL AX (Multiply AX by AX ; the result is represented as DX:AX)
XOR AX,DX

函数可以描述为:H(X) = F(X & 0xFFFE); F(X) = ((X * X) mod 2^16) xor ((X * X) div 2^16)

计算从 1 到 2^16 的所有值并在 matlab 上绘制,以便“看到”某些函数。

谁能帮我找到这个问题的答案? (当给定 y 时,参数 x 是什么)。 可能对于某些值有不止一个答案,所以缩小范围是我的目标。

谢谢, 或者。

【问题讨论】:

  • 作为一个简单的解决方案,生成一个查找表?
  • 你想要多快?由于输入很小,你可以很容易地暴力破解它。
  • 你没有128k?这是什么古老的系统:)
  • 你能解释一下“反向”是什么意思吗?您是要创建程序集的源代码还是要返回映射到结果的原始值的集合函数?
  • 由于AND 操作已经具有破坏性,我想说没有办法扭转这个操作,因为仅仅由于这部分你已经有至少2个输入值给出相同的输出,所以信息丢失。还是我误解了你的问题……?

标签: function assembly reverse-engineering


【解决方案1】:

这是hash function.
您无法反转散列函数,因为它的全部意义在于它是单向函数。
乘法显然是可逆的,而不是异或。通过结合乘法的低部分和高部分,您会丢失信息。

正如您在图中看到的那样,有一些空格,因为该图中有 2^16 个空格,这意味着还有不同的输入值散列到相同的值。
这在散列函数中很常见。

“反转”它的唯一方法是构建一个查找表,将输出值转换为可能的输入值。但是,您会发现每个输出值都是 1 个或多个输入值。

偶数 x 偶数总是 4 的倍数。
所以低 2 位总是 0,因此结果的低 2 位是乘法的第 16+17 位。
位 2..15 是位 2..15 xor 位 18..31 的混合。
快速模拟显示 24350 个独特的输出,因此每个输入值平均 1.34 0.34 个重复,还不错。
最大碰撞次数为 6,但大多数数字不会发生碰撞。

对于所有不冲突的数字,您可以在查找表中唯一地查找您的输入值(所有这些显然都忽略了奇数输入值)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多