连续使用的反转AND/移位指令

逆向工程 部件 x86
2021-06-16 04:44:50

我正在处理一些汇编代码的逆向,并将其处理成一些伪代码,以开始进行逆向尝试。该函数对传入的数据执行某种加密,我正在尝试对其进行解密。然而,我不太确定从哪里开始逆转本身。下面是我试图逆转的算法。

问题:既然编码后的字符串存储在rev3中,那么AND指令运行时,存储在那里的字符串数据不会被抹掉吗?我对此很陌生,但这似乎是不可逆的。AND 与转变相结合让我真的很困惑。我会很感激有一种方法可以扭转这种情况。

string = [102, 111, 111] // the string "foo"
coded[3];
for (i = 0; i < len(string); i++){

  rev1 = rev2 = rev3 = string[i]

  rev3 = rev3 & 0x30 // obliterate here?
  rev1 = rev1 >> 4

  rev3 = rev3 ^ rev1
  rev1 = rev2

  rev1 = rev1 & 1
  rev2 = rev2 << 1

  rev1 = rev1 ^ rev2
  rev3 = rev3 >> 2

  rev1 = rev1 << 2
  rev3 = rev3 ^ rev1
  rev3 = rev3 & 0xff

  coded[i] = rev3

}
1个回答

最简单的解决方案

由于您提供的函数对字符进行操作,因此只有256可能的输入,因此您可以运行一个简单的程序来检查从0to255到 get 的所有字符的返回值

#include <stdio.h>

int main()
{
    int rev1, rev2, rev3;
    for (int i = 0; i < 256; i++)
    {
        rev1 = rev2 = rev3 = i;
        rev3 &= 0x30;
        rev1 >>= 4;
        rev3 ^= rev1;
        rev1 = rev2;
        rev1 &= 1;
        rev2 <<= 1;
        rev1 ^= rev2;
        rev3 >>= 2;
        rev1 <<= 2;
        rev3 ^= rev1;
        rev3 &= 0xff;
        printf("%d: %d\n", i, rev3);
    }
}

您将获得所有可能的值以及参数,因此您可以反转上面程序的输出,您将获得解密功能。