[核心的代码就是这一部分,只要得到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
}