009-Boonz-KeygenMe#1

该文章描述了一个无壳汇编语言程序,通过OD调试器分析关键call,涉及三个算法步骤:1)字符串减法运算;2)平方并乘法运算;3)固定值乘法及减法运算。程序将这些计算结果转化为16进制字符串,然后拼接成Bon-%s-%s-%s格式的输出。给定输入字符串后,程序会检查长度并执行这些算法,最后打印出结果。
摘要由CSDN通过智能技术生成

第一道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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值