[XYCTF新生赛]-Reverse:ez_rand解析(爆破时间戳,汇编结合反汇编)

无壳

查看ida

这里是利用time64获取种子,但是time64不是标准的函数,这里是伪随机数,简单地来说就是它不是通过时间来确定种子,所以我们没办法在脚本里直接调用它得到种子,那就意味着我们不知道种子是多少,只能爆破。

完整exp:

复制代码
#include<iostream>
#include<ctime>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;


int main()
{
    int seed=0;
    int v7;
    unsigned char result[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};
    char flag[50]={0};
    for(seed=0;seed<pow(2,16);seed++)
    {
    	srand(seed);
        for(int i=0;i<29;i++)
        {
            v7=rand();
            long long temp=(2155905153*1LL*v7)>>32;
            flag[i]=result[i]^(v7+((temp&0x80000000)!=0)+(temp>>7));
        }
        if(strstr(flag,"flag")||strstr(flag,"XYCTF"))
        {
        	printf("%s %d",flag,seed);
		}
	}
}

这里建议用c++写

#补充1:这里的temp是为了减少括号的使用,以免括号过多导致编程错误。

#补充2:这里的result最好用ida的export data出来,这里要注意

前面3个数据0xc7,0x45,0xb0是机器码,是进行操作的,它不是v9数组的字符,后续出来的v9数组字符同理。

#补充3:这里能爆破时间戳是因为从汇编上看返回的种子存在ax寄存器里,而movzx指令只是用0扩展并转移数据用的,那意味着种子就只有16位,也就是两个字节,最大值为2的16次方,可以爆破。

相关推荐
电报号dapp11919 小时前
NFT系统开发:在数字荒漠中铸造文明
安全·去中心化·区块链·智能合约
乾元20 小时前
企业无线的 AI 频谱与功率自动优化——从人工勘测到“可学习的无线网络”(含真实室内工程案例)
服务器·网络·人工智能·网络协议·安全·信息与通信
2301_7807896620 小时前
服务器感染的病毒有哪些特点呢?
安全·web安全
BEOL贝尔科技20 小时前
实验室的温湿度监控设备实时监测温度守护样本安全?又是如何保障的呢?
安全
manok21 小时前
探索研究:军用领域软件工厂建设核心路径——可信仓库与SBOM驱动的安全高效研发模式
大数据·人工智能·安全·软件工厂
FIT2CLOUD飞致云21 小时前
操作教程|JumpServer基于作业中心脚本定时删除Windows Server本地用户
运维·网络安全·开源·堡垒机
奥升新能源平台21 小时前
奥升充电平台安全稳定体系构建
运维·安全·开源·springcloud
国冶机电安装21 小时前
燃气管道工程全解析:系统构成、施工规范与安全应用指南
安全
厦门辰迈智慧科技有限公司21 小时前
城市地下管网全域监测与安全防控整体解决方案
数据库·安全·物联网解决方案·地下管网监测·城市地下管网监测
国科安芯21 小时前
商业卫星多轴步进驱动系统的抗辐照MCU集成方案
运维·网络·单片机·嵌入式硬件·安全·安全威胁分析·risc-v