一个简单Crackme的分析

题目:[Reverse Crackme]题目连接

要求:逆向并计算相应的key

题目分析

 一个简单Crackme的分析_第1张图片

如图。是nSPack的壳,可以使用OD的esp定律脱壳。也可以使用脱壳机(百度就有)。为了简单,这里使用nSPack脱壳机进行脱壳。

一个简单Crackme的分析_第2张图片

 一个简单Crackme的分析_第3张图片

如图。发现程序是一个控制台程序(可以查找main入口方法)瞎输入一些数字上去,显示字符串error,可以寻找字符串找到关键函数。

一个简单Crackme的分析_第4张图片 

如上代码可知,程序要求输出一个字符串。之后判断字符串长度,满足条件后经过一个算法来判断字符串是否满足。满足输出right,否则输出error。分析该crackerme的关键便是这段逆向算法了。

 一个简单Crackme的分析_第5张图片

如上为程序的关键算法。分析如下:

由if语句可知key的长度为42,否则会直接输出error。进入算法后会进入一个while循环,这里涉及2个字符串常量byte_402130dword_402150。双击这两个字符串常量发现如下图:

一个简单Crackme的分析_第6张图片

此处有个坑。初学者认为00402130这里的数据只有0x74这一个,其实不然,他是包含后面字符串的,所以后面字符串也是残缺的,整体字符串应为“this_is_no_flag”(这里一开始也踩坑了,菜的不行)。而后面00402150的数据也就比较好分析了,从12h到12h刚好42个数。

 while ( (*(&Buf + v4) ^ byte_402130[v4 % 16]) == dword_402150[v4] )

这行代码的行为也就十分明显了,逐个拿取输入的字符串(Buf为输入的字符串)与byte_402130[v4 % 16]做亦或运算,再将结果与00402150的数据进行比较,直到42个字符都比较正确,则输入正确,若有一个不正确则会输出error!

  1. PEID查壳
  2. 启动Crackme,验证软件功能
  3. 载入IDA PRO,F5进行分析
  4. 算法分析
  5. 下面是根据所给crackerme算法计算key的c++语言程序代码
#include 

int _tmain(int argc, _TCHAR* argv[])
{
	int i;
	char s[] = "this_is_not_flag";
	char v[100] = { 0x12, 0x04, 0x08, 0x14, 0x24, 0x5C, 0x4A, 0x3D, 0x56, 0x0A, 0x10, 0x67, 0x00, 0x41, 0x00, 0x01, 0x46, 0x5A, 0x44, 0x42, 0x6E, 0x0C, 0x44, 0x72, 0x0C, 0x0D, 0x40, 0x3E, 0x4B, 0x5F, 0x02, 0x01, 0x4C, 0x5E, 0x5B, 0x17, 0x6E, 0x0C, 0x16, 0x68, 0x5B, 0x12 };
	for (i = 0; i<42; i++)
		printf("%c", (v[i] ^ s[i % 16]));
	getchar();
	return 0;
}

key就不给了,自己copy这个程序跑一下就知道了

你可能感兴趣的:(crackme)