Cruehead-CrackMe
程序分析
程序试图打开CRACKME3.KEY文件,通过后面代码很显然知道此文件存储密码。
,
注意BytesToRead的值,只读取前面18个字节的内容。
进入地址00401311处函数,进行第一次运算:将前14位(0x4F - 0x41)字节分别与0x41,0x42…0x4F进行亦或。注意[0x4020F9]的变换,[0x4020F9]会是所有亦或值的和。它在后面有大用。
亦或值的和 与 0x1234578再次亦或。
第二个函数,将字符串指针抬高14位,指向后四位。
最终对两者比较。
算法总结
我们输入只有前18位有效,前14位用来运算,后四位用来校验。
解密代码:
#include<iostream>
typedef unsigned long DWORD;
using namespace std;
int main() {
string str1;
cin >> str1;
string tmp = str1;
tmp.resize(14);
char bl = 0x41;
DWORD eax = 0;
for (; bl != 0x4F; bl++)
{
str1[bl - 0x41] ^= bl;
eax += str1[bl - 0x41];
}
eax ^= 0x12345678;
char buffer[20];
sprintf_s(buffer, "%x",eax);
cout << tmp << "+" << "后四位的ASCII码" << buffer;
}
因为校验位不一定是可见字符,我们需要010Editor软件对密码文件进行编辑,同时由于小端存储,低位存入低地址。最终形式如下。