首先发现 有两输入点。

对于第一个输入的操作

通过循环 将输入分为 [0:6] [7:16] 分别保存到对应的内存中

然后第二次输入

首先,将我们的输入 计算出两个值

第一个用 / 12379 第二个用 % 12379

计算出的值 利用 if 比较

其中利用 function 函数计算。

这里计算不可逆 可以通过 爆破得到

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double function(double a, double b)
{
	double v2 = pow(a, b - 1.0);
	double v3 = v2 / exp(a);
	return v3;
}

int main()
{
	int input = 0;
	while (1)
	{
		double v15 = 0;
		double v16 = 0;
		double v17 = 0;
		double v18 = (double)(input / 12379) + 1.0;
		do
		{
			v16 = v16 + function(v17, v18) * 0.001;
			v17 = v17 + 0.001;
		} while (v17 <= 100.0);
		int v19 = (int)(v16 + v16 + 3.0);
		if (v19 != 0x13B03)
		{
			printf("input = %d\\n", input);
			input = input + 1;
			continue;
		}
		double v20 = 0;
		double v21 = (double)(input % 12379) + 1.0;
		do
		{
			v15 = v15 + function(v20, v21) * 0.001;
			v20 = v20 + 0.001;
		} while (v20 <= 100.0);
		if ((int)(v15 + v15 + 3.0) == 0x5A2)
		{
			printf("the input is :%d \\n", input);
			break;
		}
		printf("input = %d\\n", input);
		input = input + 1;
		
	}

	return 1;
}

99038

后面的 一段逻辑是 自己生成的 不会受我们的输入影响,可以动态调试 dump

然后我们要做的 是找到哪儿对我们的输入进行了操作

可以发现后面有两次 循环的加密 RC4 + 抑或