BUU–findKey

分析

首先查壳,发现是32位无壳的,然后放入IDA中看看,直接shift+12去找关键点

image-20220508170810194

对它进行交叉引用,去看看这个程序要干嘛

image-20220508170912439

这里发现,它这里有两个一样的语句,直接nop掉一句,再声明一下就可以反汇编了

整个看起来很复杂,但是有用的也就那几个

image-20220508171103534

简单分析之后可以知道有用的部分只有sub_40101E函数和sub_401005这两个函数,其中sub_401005这个函数用了两次,首先去sub_40101E函数看看它在干嘛

image-20220508172505650

再结合函数库

image-20220508192202123

能明白这里是一个哈希加密的东西。

然后去sub_401005函数看看在干嘛

image-20220508192328110

这是一个很简单的异或。整体的逻辑也就是要得到第二个消息盒所得到的值。首先要通过第一个异或得到第二个异或需要用的东西,再通过第二个异或得到flag。

脚本

#include<stdio.h>
#include<string.h>
int main()
{
char Str[]="0kk`d1a`55k222k2a776jbfgd`06cjjb";
char v15[]="SS";
int v9=strlen(Str);
for(int i=0;i<v9;i++)
{
Str[i]^=v15[i%2];
printf("%c",Str[i]);
}
}

得到

c8837b23ff8aaa8a2dde915473ce0991

然后知道得到的Str是通过哈希加密的,看这个结构为32位16进制,猜测是MD5的加密。接着进行第二个异或

#include<stdio.h>
#include<string.h>
int main()
{
char String1[]="123321";
char a[]={0x57, 0x5E, 0x52, 0x54, 0x49, 0x5F, 0x01, 0x6D, 0x69, 0x46, 0x02, 0x6E, 0x5F, 0x02, 0x6C, 0x57, 0x5B, 0x54, 0x4C};
int v10=strlen(a);
for(int i=0;i<v10;i++)
{
a[i]^=String1[i%6];
printf("%c",a[i]);
}
}

得到flag

flag{n0_Zu0_n0_die}

总结

这道题涉及到了简单的花指令和哈希密码,本题的难点在于会忽视掉这个哈希密码,从而无法在第二个脚本中得到flag。

MD5的简单判别方法:

128 位的 MD5 散列在大多数情况下会被表示为 32 位十六进制数字。