003-Cruehead

003-Cruehead

KeyFile类型
下面进行逆向分析操作,首先拖入PEiD中进行查壳操作,并判断其开发工具。
在这里插入图片描述
从图中可以判断出来该软件没有加壳,是MASM32/TASM32的汇编程序。
下面将该软件直接拖入到OllyDbg中进行动态分析。
在这里插入图片描述
按理说,这里应该进行搜索字符串的操作,但是我们不这么做。
从上图中的红色注释我们可以发现,程序即将进行CreateFile和ReadFile操作,因此我们关注一下输入的参数,记录一下文件名:

00401028 |. 68 D7204000 push Cruehead.004020D7 ; |CRACKME3.KEY

我们随之在当前软件的目录下创建这个名字的文件:“CRACKME3.KEY”,其中写入26个英文字母作为输入。

继续进行调试,发现到这个位置的时候,字母已经读入内存之中。
在这里插入图片描述
0x00401066处将读入的字符数和0x12进行比较,进而选择是否跳转。这部分的含义是判断输入的字符个数是否为0x12也就是18。
保存在0x00402008中的字符串也在注释中可以显示出来,即a-r的18个字母。
那么继续跟踪此流程,F7进入0x00401074的函数之中,如下图:
在这里插入图片描述

首先清空ecxeax寄存器的数值。并且将参数(a-r字符串)赋值给esi,将0x41(‘A’)赋值给bl
下面进行一个循环,首先将esi地址处保存的一字节数据(‘a’)赋值给al
再将al(‘a’)与bl(‘A’)异或的值赋给al,结果为0x20(0x20在ASCII码中表示为空格),再将此al值赋给esi地址处保存的一字节数据,此时原参数字符串变为(‘ b-r’)。
之后对esibl进行加一操作(字符数组指针后移指向下一个字符、对此当前字符的ASCII码改变),并且将上面异或的结果加在0x004020F9的内存中。
最后将cl作为计数器加一,在跳转处判断bl是否增加到0x4F,如果有则退出,如果没有则继续循环。

ecx作为本次程序的计数器,则最终给0x402149的赋值为0xE。

这便是循环的内容了,总共会循环0x4F-0x41,即14次。得到两个结果:

  • 就是将参数字符串的前14个字符分别与0x41-0x4F进行异或,并且将异或的值覆盖在参数字符串的对应位置上,得到 ’ ’ *14+“opqr”(共18位)。
  • 每次异或后的结果累加在0x4020F9的位置之中。

跳出这个函数之后,继续进行运算:
在这里插入图片描述
先将0x4020F9内存处的值(前14位和0x41-0x4F分别异或之和)与常量0x12345678进行异或。
其中0x0040108B处的函数所作的操作为:将18位字符串的后4位赋值给eax寄存器,再和0x4020F9内存处的值(前14位和0x41-0x4F分别异或之和)进行比较。
如果这部分判断成功,"CrackMe v3.0"字符就会显示在弹出的程序框中。后面的流程不再赘述,我们用C语言程序来模拟这个汇编的判断过程,先得出正确的字符串,再看看结果。

#include<iostream>
#include <fstream>
using namespace std;

int main()
{
	unsigned char key[18] = { 0 };
	char str[] = "monster290test";
	int bl = 0x41;
	int sum = 0, tmp = 0;
	for (size_t i = 0; i < 14; i++, bl++) {
		tmp = str[i] ^ bl;
		sum += str[i];
		if (tmp == 0)
		{
			break;
		}
		key[i] = tmp;
	}
	cout << sum << endl;
	sum ^= 0x12345678;

	*(unsigned int*)&key[14] = sum;

	ofstream outFile("CRACKME3.key", ios::out | ios::binary);
	if (!outFile)
	{
		cout << "无法打开文件" << endl;
		return 1;
	}
	outFile.write(reinterpret_cast<const char*>(&key), 18);
	outFile.close();
	return 0;
}

生成的CRACKME.KEY文件放在当前软件目录下,重新打开软件,发现如下的结果。
在这里插入图片描述
至此我们破解成功。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雨落心中一点寒~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值