KCTF-病疫先兆

一道爆破题,我不理解为什么不把这题放在第二个

ida打开

先对输入做了分割,分成了三部分

看到下面对中间部分做了校验,得到第一部分KCTF

剩下两部分都用到了随机数,随机数的种子是五位,并且都是数字

 

 判断正确的条件是,循环执行20次,每次rand()都要等于v7,下面同理,直接给出脚本

#include<stdio.h>
#include<iostream>
#include <stdlib.h>
#include<windows.h>
using namespace std;

int dword_A2F050[20] = {
    0x00002BB6, 0x00006B5A, 0x000003D4, 0x0000152B, 0x00006E04, 0x0000254C, 0x000040AE, 0x000056CA, 
    0x000017E1, 0x000055C7, 0x00003641, 0x00002D3C, 0x00000A41, 0x00004BC5, 0x00006233, 0x00001FE7, 
    0x00006E05, 0x00000F6E, 0x00006398, 0x00006AD7
};
int dword_A2F000[20] = {
    0x00003BFC, 0x00002173, 0x000025BB, 0x0000380B, 0x00002C13, 0x000075BE, 0x00007366, 0x000046A3, 
    0x000013C1, 0x0000159B, 0x00005B5F, 0x0000534F, 0x00004E37, 0x00003A04, 0x00001301, 0x00005D0C, 
    0x00004155, 0x000048E9, 0x000061D2, 0x00006158
};
int main()
{
    DWORD x = 0;
    for(int i = 0;i <= 9;i++)
    {
        for(int i1 = 0;i1 <= 9;i1++)
        {
            for(int i2 = 0;i2 <= 9;i2++)
            {
                for(int i3 = 0;i3 <= 9;i3++)
                {
                    for(int i4 = 0;i4 <= 9;i4++)
                    {
                        x = i4 + (i3 * 10) + (i2*100) +  (i1 * 1000) + (i*10000);
    
                        srand(x);
                        int times = 0;
                        while (rand()== dword_A2F000[times])
                        {
                            times += 1;
                            if (times == 20){
                                printf("%d,%d,%d,%d,%d\n",i,i1,i2,i3,i4);
                            }
                        }
                    }                    
                }
            }
        }    
    }
    return 0;
} 

 

posted @ 2022-11-29 20:53  写在风中的信  阅读(34)  评论(0编辑  收藏  举报