第一道3星算法题。
首先Exeinfo查壳,发现没有壳,是汇编语言程序。
OD附加程序,字符串搜索关键位置。分析上下的逻辑代码。
我们进入这个关键call进行分析
总结:
这个算法其实就是计算出来三个数字字符串,拼接成"Bon-%s-%s-%s"这种形式。
第一个算法:
for (int i = 0; i < nLen; i++)
{
nEbx -= szName[i] - 0x19;
}
第二个算法:
int nEax = nEbx * nEbx;
nEbx *= nEax;
第三个算法:(是一个固定值)
int nEcx = 0x40E0F8 * 0x40E0F8;
nEcx -= 0x40E0F8;
取每轮算法的计算结果值,进行上述拼接就是答案。
#include <iostream>
using namespace std;
int main()
{
char szName[10] = { 0 };
cin >> szName;
int nLen = strlen(szName);
if (nLen < 4 || nLen>32)
{
printf("字符串长度不对\n");
return 0;
}
int nEbx = 0;
for (int i = 0; i < nLen; i++)
{
nEbx -= szName[i] - 0x19;
}
printf("0x40E0F8:%x\n", nEbx);
char sz40E0F8[10] = { 0 };
sprintf_s(sz40E0F8, "%lX", nEbx);
//计算第二个字符串
int nEax = nEbx * nEbx;
nEbx *= nEax;
char sz40E1F8[10] = { 0 };
sprintf_s(sz40E1F8, "%lX", nEbx);
//计算第三个字符串
int nEcx = 0x40E0F8 * 0x40E0F8;
nEcx -= 0x40E0F8;
char sz40E2F8[10] = { 0 };
sprintf_s(sz40E2F8, "%lX", nEcx);
char szBuffer[50] = { 0 };
sprintf_s(szBuffer, "Bon-%s-%s-%s", sz40E0F8, sz40E1F8, sz40E2F8);
cout << szBuffer << endl;
return 0;
}
执行结果:
点击check