exeinfope查壳显示UPX,用UPX /d 脱壳失败。。。那就用esp大法直接jump到OEP保存文件。 输入UID和KEY后,UID一个进行了一个简单的计算,不知道要干啥。。 接着往下调试 定位关键判断
经过数次调试后, 发现同一个UID的在sub_4011B0中算法是固定的 大概如下:
[C] 纯文本查看 复制代码 void sub_4011B0(char* p)
{
while (1)
{
char& i = *p++;
if (i == 0)
break;
if (i >= 'a' && i <= 'z')
{
int x = i - 0x16 - 0x61;
x *= 3;
x = x % 0x1a;
x += 0x61;
x += 0x1a;
i = x;
}
else if (i >= 'a' && i <= 'z')
{
int x = i - 0x16 - 0x41;
x *= 3;
x = x % 0x1a;
x += 0x41;
x += 0x1a;
i = x;
}
}
}
但是!有瑕疵!我写了个反函数,求不出对应的key(拿到key后反向也是验证错误) 咋办...。做了一会web题,也做不出来(哭),又回来做这个题,忽然想到一个小技巧,可以把[a-zA-Z]全部输入到key里面,让源程序给我把映射算出来。于是乎:
求得映射为 mpsvybehknqtwzcfiloruxadgjMPSVYBEHKNQTWZCFILORUXADGJ
最后写个程序:
[C] 纯文本查看 复制代码 int main()
{
char arr1[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
char arr2[] = "mpsvybehknqtwzcfiloruxadgjMPSVYBEHKNQTWZCFILORUXADGJ";
char key[] = "flag{Happy_New_Year_52Pojie_2022}";
for (auto it : key)
{
if (!isChar(it))
{
printf("%c", it);
continue;
}
for (int i = 0; i < 52; ++i)
{
if (arr2[i] == it)
{
printf("%c", arr1[i]);
break;
}
}
}
}
程序打印结果 prwy{Hwbbe_Jgm_Egwt_52Bszqg_2022}输入源程序 验证正确 取了个巧,有点菜,算法没逆出来,写不出注册机 |