[核心的代码就是这一部分,只要得到v4的值,也就是随机种子,那就可以把值弄出来了。所以我们需要做的就是爆破随机种子。
然后有一点是需要注意的,IDA这里显示的数据有可能是小端序的,所以我们需要export data,在菜单栏的Edit按钮下可以找到。
我们先对v9[0]这里export data
可以发现export data之后,数据就是我们熟悉的大端序了。但是,除了我们需要的数据,我们还发现多了三个十六进制数。这三个十六进制数是x86指令的机械码,粘贴之后记得去掉就行。
然后就是写爆破程序:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<ctime>
using namespace std;
unsigned char cipher[50] = {0x5D, 0x0C, 0x6C, 0xEA, 0x46, 0x19, 0xFC, 0x34,0xB2, 0x62, 0x23, 0x07, 0x62, 0x22, 0x6E, 0xFB, 0xB4, 0xE8, 0xF2, 0xA9, 0x91,0x12, 0x21, 0x86, 0xDB, 0x8E, 0xE9, 0x43, 0x4D};
int v7;
bool cmp(char s[])
{
if(strstr(s,"XYCTF")||strstr(s,"flag"))
{
return true;
}
return false;
}
char ans[50];
int _round=-5;
signed main()
{
for(unsigned int v4=0;v4<65536;v4++)
{
srand(v4);
for(int i=0;i<29;i++)
{
v7=rand();
unsigned long long temp=((2155905153*1LL*v7)>>32);
unsigned char num=v7+(int)((temp&0x80000000)!=0)+((int)temp>>7);
ans[i]=num^cipher[i];
}
if(cmp(ans))
{
_round=v4;
break;
}
}
printf("%s %d",ans,_round);
//XYCTF{R@nd_1s_S0_S0_S0_easy!} 21308
}