首页
社区
课程
招聘
看雪 2022·KCTF 秋季赛第六题 病疫先兆
发表于: 2022-11-29 21:44 8252

看雪 2022·KCTF 秋季赛第六题 病疫先兆

2022-11-29 21:44
8252

题目的逻辑很简单,就是一个输入然后,验证输入,全部在main函数里面很明显。

 

题目的大题意思就是输入14个字节的字符串,然后分成三部分,第一部分转换为十进制数,第二部分不作转换,第三部分也转换为十进制数字。下面就是这题的主要验证逻辑。

 

!

 

可以判断出第二部分就是KCTF四个字母占用四个字节,然后上面有俩个循环,分别进行伪随机比较(与已知不变的盒子比较).

 

由字符长度为14个字节可以判断出伪随机数字的种子为五位数。所以可以进行爆破。

 

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
#include<stdlib.h>
int main() {
    unsigned int rand1[]={15356, 8563, 9659, 14347, 11283, 30142, 29542, 18083, 5057, 5531, 23391, 21327, 20023, 14852, 4865, 23820, 16725, 18665, 25042, 24920,0};
    unsigned int rand2[]={11190, 27482, 980, 5419, 28164, 9548, 16558, 22218, 6113, 21959, 13889, 11580, 2625, 19397, 25139, 8167, 28165, 3950, 25496, 27351,0};
 
    for(int i=10000;i<100000;i++) {
        int j=0;
        srand(i);
        while(rand1[j]==rand())j++;
        if(rand1[j]==0) {
            printf("%d\n",i);
            break;
        }
    }
    for(int i=10000;i<100000;i++) {
        int j=0;
        srand(i);
        while(rand2[j]==rand())j++;
        if(rand2[j]==0) {
            printf("%d",i);
            break;
        }
    }
}
//序列号为14725KCTF83690

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//