003-Cruehead-CrackMe-3.rar
(2.69 KB, 下载次数: 2)
2022-11-8 12:11 上传
点击文件名下载附件
下载积分: 吾爱币 -1 CB
1.png (8.75 KB, 下载次数: 0)
下载附件
2022-11-8 11:56 上传
发现什么内容也没有显示,查一下壳,无壳
2.png (104.97 KB, 下载次数: 0)
下载附件
2022-11-8 11:57 上传
OllyDbg打开文件发现右侧注释调用与操作文件相关的函数,推测与文件有关。
3.png (34.64 KB, 下载次数: 0)
下载附件
2022-11-8 11:57 上传
在入口处打个断点运行程序,通过观察可以看到调用函数CreateFileA,栈帧里也出现CRACKME3.KEY这个文件名。函数结束后做比对,此时eax的值为0,没满足跳转条件再接着运行就直接结束程序了。所以推测eax的值与CRACKME3.KEY的存在有关。
4.png (48.98 KB, 下载次数: 0)
下载附件
2022-11-8 11:57 上传
在相同目录下创建CRACKME3.KEY文件,随便输入几个数1234,重复上一次调试,发现满足跳转条件,继续调试观察后面程序
5.png (34.15 KB, 下载次数: 0)
下载附件
2022-11-8 11:57 上传
发现函数调用后出现了比对,比对错误就会直接跳转到上面的jmp然后跳转到程序结束,那么就破解失败了。所以我查看一下比对内容发现0x4021A0与0x12比对,0x4021A0对应上一条函数中的pBytesRead,0x12,推测pBytesRead是文件字节数等于18。在CRACKME3.KEY中输入18个字节再重新调试。
6.png (31.64 KB, 下载次数: 0)
下载附件
2022-11-8 11:57 上传
成功跳过jnz,调试到下一条函数F7进入函数内
观察代码前两行将ecx和eax归零,然后将地址00402008赋值给esi,给bl赋值0x41。
然后便进入do..while..循环。
先将地址esi赋值给al,然后al与bl进行异或运算后重新赋值al,再将al的值赋值到esi中。
esi加一,bl加一,eax的值(此时eax的值为al)加到0x4020F9。
将al与0做对比,如果相等就结束函数,反之继续。
cl加一,bl与0x4F作比较,如果不为0就继续循环。
结束循环后,将ecx的值赋值给0x402149。
7.png (17.87 KB, 下载次数: 0)
下载附件
2022-11-8 11:57 上传
**总的来说这个函数的作用是:将文件中前14个字符分别与ABCDEFGHIJKLMN进行异或运算,每次异或运算后的结果进行累加作检验和。**
循环结束后退出函数,继续调试,下一条指令将0x4020F9与0x12345678做异或运算,也就是将检验和与0x12345678做异或运算。
8.png (14.52 KB, 下载次数: 0)
下载附件
2022-11-8 11:57 上传
接着运行到下个函数F8进入函数,将esp+0x4赋值给esi,然后esi加0xE,然后赋值给eax。此时eax的值为文件18个字节中末尾的4个字节
9.png (8.68 KB, 下载次数: 0)
下载附件
2022-11-8 11:57 上传
10.png (10.56 KB, 下载次数: 0)
下载附件
2022-11-8 11:57 上传
跳出函数后紧接着就进行了比对,0x4020F9与eax做比对。0x4020F9是异或后的检验和与eax文件末尾4个字节做对比。此时我已经可以分析出程序的算法了。
11.png (14.61 KB, 下载次数: 0)
下载附件
2022-11-8 11:57 上传
**算法过程:将文件中前14个字符分别与ABCDEFGHIJKLMN进行异或运算,每次异或运算后的结果进行累加作检验和。然后将检验和与0x12345678进行异或,最后将检验和异或后的结果与末尾4个字符进行对比,对比正确就成功破解了。**
现在我们来实现一下,在内存窗口找到0x4020F9的位置,数据是B8 57 34 12。
12.png (3.53 KB, 下载次数: 0)
下载附件
2022-11-8 11:57 上传
用UE打开本地CRACKME3.KEY文件,使用16进制编辑修改后4个字节的值,然后保存
13.png (14.03 KB, 下载次数: 0)
下载附件
2022-11-8 11:57 上传
保存后运行程序弹出成功窗口!
14.png (14.17 KB, 下载次数: 0)
下载附件
2022-11-8 12:07 上传
用C语言对算法进行一个简单实现,代码如下:
[C] 纯文本查看 复制代码#include
#include
void crack_003(const char* in_pwd);
int main(){
const char *inpwd = "[email protected]!";
crack_003(inpwd);
return 0;
}
void crack_003(const char* in_pwd) {
char pwd[0x12] = { 0 };
char bl = 'A';
unsigned int sum = 0;/*检验和*/
memcpy(pwd, in_pwd, 0x12);
int i;
i = 0;
do
{
pwd ^= bl;
sum += pwd;
bl++;
i++;
if (!pwd)break;
} while (bl != 'O');
sum ^= 0x12345678;
*(unsigned int*)&pwd[0xE] = sum;
unsigned char* tmp = (unsigned char*)&pwd;
memcpy(tmp, in_pwd, 14);
for (int k = 0; k
运行结果:
15.png (2.88 KB, 下载次数: 0)
下载附件
2022-11-8 12:09 上传
16.png (13.59 KB, 下载次数: 0)
下载附件
2022-11-8 12:09 上传
可以正常破解,就是编码有些问题。
17.png (12.02 KB, 下载次数: 0)
下载附件
2022-11-8 12:09 上传