xyctf ez_rand

[在这里插入图片描述核心的代码就是这一部分,只要得到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
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值